hdoj-1757-A Simple Math Problem【矩阵的快速幂】
2015-07-29 10:17
302 查看
A Simple Math Problem
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3465 Accepted Submission(s): 2087
[align=left]Problem Description[/align]
Lele now is thinking about a simple function f(x).
If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .
Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
[align=left]Input[/align]
The problem contains mutiple test cases.Please process to the end of file.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
[align=left]Output[/align]
For each case, output f(k) % m in one line.
[align=left]Sample Input[/align]
10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
[align=left]Sample Output[/align]
45 104
[align=left]Author[/align]
linle
[align=left]Source[/align]
2007省赛集训队练习赛(6)_linle专场
[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you:
1575
1588
3117
2276
2256
#include<stdio.h> #include<string.h> struct matrix{ int m[10][10]; }ans,base; int MOD; matrix multi(matrix a,matrix b){ matrix temp; for(int i=0;i<10;++i){ for(int j=0;j<10;++j){ temp.m[i][j]=0; for(int k=0;k<10;++k) temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD; } } return temp; } void output(matrix a){ for(int i=0;i<10;++i){ for(int j=0;j<10;++j) printf("%d ",a.m[i][j]); printf("\n"); } printf("**************\n"); } matrix fast_mod(int n) {//求base的 n 次方 //为base 赋初值 memset(base.m,0,sizeof(base.m)); for(int i=0;i<10;++i){ scanf("%d",&base.m[0][i]); } for(int i=1;i<10;++i) base.m[i][i-1]=1; // 将 矩阵ans 初始化为单位矩阵 //output(base); memset(ans.m,0,sizeof(ans.m)); for(int i=0;i<10;++i) ans.m[i][i]=1; // output(ans); while(n){ if(n & 1) ans=multi(ans,base); base=multi(base,base); n>>=1; } return ans; } int main(){ int k,m; while(~scanf("%d%d",&k,&m)){ MOD=m; fast_mod(k-9); int i,j,ts=0; for(i=0,j=9;i<9;++i,--j){ ts=(ts+ans.m[0][i]*j)%MOD; } printf("%d\n",ts); } return 0; }
相关文章推荐
- 布局文件中tools:context的用途
- 静态成员变量和静态成员函数
- OCX和DLL的区别
- 题乌江亭
- JSON——李炎灰js笔记
- iOS--RunLoop原理介绍
- 获取iOS设备唯一标识
- 新建一个TEMP02作为默认表空间,然后删除之前的表空间
- 6月.CN域名注册量突破1200万个 增速环比加快
- ActiveMQ入门实例
- 解决VIM-NERDTree windows上无效书签的问题
- html5的web存储与cookie的区别
- csu 1507: 超大型LED显示屏(要重新敲一遍)
- poj 1185 炮兵阵地 【状压DP】
- 在IE兼容模式下 提示JSON未定义
- C++设计模式:单例模式
- 饮中八仙歌
- 初学structs2,表单验证简单补充
- bzoj3503: [Cqoi2014]和谐矩阵
- 会话描述协议(SDP)介绍