题目链接:http://lightoj.com/volume_showproblem.php?problem=1132

题意:

  给定n、k,求(1K + 2K + 3K + ... + NK) % 232

题解:

  设sum(i) = 1K + 2K + 3K + ... + iK

  所以要从sum(1)一直推到sum(n)。

  所以要找出sum(i)和sum(i+1)之间的关系:

  

  

  

  好了可以造矩阵了。

  (n = 6时)

  矩阵表示(大小为 1 * (k+2)):

  

  

  初始矩阵start:

  

  也就是:

  

  

  特殊矩阵special:

  

AC Code:

#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_L 60
#define MAX_K 55 using namespace std; struct Mat
{
int n;
int m;
unsigned val[MAX_L][MAX_L];
Mat()
{
n=;
m=;
memset(val,,sizeof(val));
}
void print_mat()
{
cout<<"--------"<<endl;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cout<<val[i][j]<<" ";
}
cout<<endl;
}
cout<<"--------"<<endl;
}
}; int k,t;
long long n;
unsigned c[MAX_K][MAX_K]; void cal_combination()
{
memset(c,,sizeof(c));
c[][]=;
for(int i=;i<MAX_K;i++)
{
c[i][]=;
for(int j=;j<=i;j++)
{
c[i][j]=c[i-][j]+c[i-][j-];
}
}
} Mat make_unit(int n)
{
Mat mat;
mat.n=n;
mat.m=n;
for(int i=;i<n;i++)
{
mat.val[i][i]=;
}
return mat;
} Mat make_start(int k)
{
Mat mat;
mat.n=;
mat.m=k+;
for(int i=;i<k+;i++)
{
mat.val[][i]=;
}
return mat;
} Mat make_special(int k)
{
Mat mat;
mat.n=k+;
mat.m=k+;
for(int j=;j<k+;j++)
{
for(int i=j;i<k+;i++)
{
mat.val[i][j]=c[k-j+][i-j];
}
}
for(int i=;i<k+;i++)
{
mat.val[i][]=mat.val[i][];
}
mat.val[][]=;
return mat;
} Mat mul_mat(const Mat &a,const Mat &b)
{
Mat c;
if(a.m!=b.n)
{
cout<<"Error: mul_mat"<<endl;
return c;
}
c.n=a.n;
c.m=b.m;
for(int i=;i<a.n;i++)
{
for(int j=;j<b.m;j++)
{
for(int k=;k<a.m;k++)
{
c.val[i][j]+=a.val[i][k]*b.val[k][j];
}
}
}
return c;
} Mat quick_pow_mat(Mat mat,long long k)
{
Mat ans;
if(mat.n!=mat.m)
{
cout<<"Error: quick_pow_mat"<<endl;
return ans;
}
ans=make_unit(mat.n);
while(k)
{
if(k&)
{
ans=mul_mat(ans,mat);
}
mat=mul_mat(mat,mat);
k>>=;
}
return ans;
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cal_combination();
cin>>t;
for(int cas=;cas<=t;cas++)
{
cin>>n>>k;
Mat start=make_start(k);
Mat special=make_special(k);
Mat ans=mul_mat(start,quick_pow_mat(special,n-));
cout<<"Case "<<cas<<": "<<ans.val[][]<<endl;
}
}

最新文章

  1. iOS 疑难杂症 — — 在 Storyboard 里 Add Size Class Customization 后再从代码里无法修改的问题
  2. 理解Kalman滤波的使用
  3. Adding a WebPart to a SharePoint 2013 Master Page 分类: Sharepoint 2015-07-08 01:03 7人阅读 评论(0) 收藏
  4. (地址)eclipse插件开发攻略的访问地址
  5. I do not want to inherit the child opacity from the parent in CSS(不想让子元素继承父元素的透明度)
  6. 快速搭建Redis缓存数据库
  7. Eclipse中新建WEB项目,JSP页面报错。
  8. shell script 基本语法
  9. Mac与Linux的一个巨大不同
  10. Session案例
  11. ASP.NET中连接数据库的各种方法
  12. Linux 远程查看tomcat控制台
  13. 多线程学习之一独木桥模式Single Threaded Execution Pattern
  14. 用户单独管理Jenkins的某些项目
  15. 201521123075 《Java程序设计》第2周学习总结
  16. (NO.00002)iOS游戏精灵战争雏形(五)
  17. 操作系统,时间片轮转算法的C语言实现Round Robin
  18. keras中的重要函数
  19. .apply()用法和call()的区别
  20. git 28原则

热门文章

  1. Ubuntu下安装JDK图文解析
  2. 网络电台(WIZ550io)
  3. Cocos2d-x 更改文字换行风格 ( cocos2dx change line )
  4. c# .net 我的Application_Error 全局异常抓取处理
  5. HDFS源码分析心跳汇报之整体结构
  6. C#泛型&lt;T&gt;说明
  7. 再说WCF Data Contract KnownTypeAttribute
  8. EasyPlayerPro windows播放器本地音频播放音量控制实现
  9. Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
  10. jQuery学习笔记(9)--jquery中的事件--$(document).ready()