HDU 1757 A Simple Math Problem 矩阵快速幂
来源:互联网 发布:js数组添加数组元素 编辑:程序博客网 时间:2024/05/21 00:51
点击打开链接
A Simple Math Problem
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2936 Accepted Submission(s): 1767
Problem Description
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.
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.
Input
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.
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.
Output
For each case, output f(k) % m in one line.
Sample Input
10 99991 1 1 1 1 1 1 1 1 120 5001 0 1 0 1 0 1 0 1 0
Sample Output
45104
Author
linle
Source
2007省赛集训队练习赛(6)_linle专场
f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10) x >= 10
求f(k)%m
递推一般都可以用矩阵快速幂来解决,关键在于构造矩阵。
/* k-9f(n) a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 f9f(n-1) 1 0 0 0 0 0 0 0 0 0 f8f(n-2) 0 1 0 0 0 0 0 0 0 0 f7f(n-3) 0 0 1 0 0 0 0 0 0 0 f6f(n-4) = 0 0 0 1 0 0 0 0 0 0 * f5f(n-5) 0 0 0 0 1 0 0 0 0 0 f4f(n-6) 0 0 0 0 0 1 0 0 0 0 f3f(n-7) 0 0 0 0 0 0 1 0 0 0 f2f(n-8) 0 0 0 0 0 0 0 1 0 0 f1f(n-9) 0 0 0 0 0 0 0 0 1 0 f0*///15MS1112K#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#define mod 10000007#define ll __int64using namespace std;ll one[10];struct Matrax{ ll m[11][11];}a,per,tmp;void init()//建立矩阵{ memset(a.m,0,sizeof(a.m)); memset(per.m,0,sizeof(per.m)); for(int i=0;i<10;i++)a.m[0][i]=one[i]; for(int i=0;i<10;i++)a.m[i+1][i]=1; for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(i==j)per.m[i][i]=1;}Matrax multi(Matrax a,Matrax b,ll m)//矩阵相乘{ Matrax c; for(int i=0;i<10;i++) for(int j=0;j<10;j++) { c.m[i][j]=0; for(int k=0;k<10;k++) c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%m; } return c;}Matrax power(ll k,ll m)//矩阵快速幂{ Matrax pp=a,ans=per; while(k) { if(k&1){ans=multi(ans,pp,m);k--;} else {k>>=1;pp=multi(pp,pp,m);} } return ans;}int main(){ ll k,m; while(scanf("%I64d%I64d",&k,&m)!=EOF) { ll sum=0; for(int i=0;i<10;i++) scanf("%I64d",&one[i]); init(); Matrax ans=power(k-9,m); for(int i=0;i<10;i++) sum=(sum+ans.m[0][i]*(10-i-1))%m; printf("%I64d\n",sum); } return 0;}
0 0
- HDU - problem 1757 A Simple Math Problem【矩阵 + 快速幂】
- hdu - 1757 - A Simple Math Problem(矩阵快速幂)
- hdu 1757 A Simple Math Problem(矩阵快速幂)
- hdu 1757 A Simple Math Problem (矩阵快速幂)
- [HDU 1757] A Simple Math Problem (矩阵快速幂)
- HDU 1757-A Simple Math Problem(矩阵快速幂)
- HDU 1757 A Simple Math Problem 矩阵快速幂
- hdu 1757 A Simple Math Problem(矩阵快速幂)
- HDU 1757 A Simple Math Problem (矩阵快速幂)
- HDU 1757 A Simple Math Problem(矩阵快速幂)
- hdu 1757 A Simple Math Problem(矩阵快速幂)
- HDU 1757 A Simple Math Problem(矩阵快速幂)
- HDU 1757 A Simple Math Problem 矩阵快速幂
- HDU 1757 A Simple Math Problem 矩阵快速幂
- HDU 1757 A Simple Math Problem(矩阵快速幂)
- HDU 1757 A Simple Math Problem 矩阵快速幂
- HDU 1757 A Simple Math Problem (矩阵+快速幂)
- HDU 1757-A Simple Math Problem(矩阵快速幂)
- 在eclipse上配置引入jar的,javadoc并让其生效的方式
- 高等数学总结(无穷级数)
- mybatis框架错误分析
- Linux编程里getopt_long_only函数用法详解
- HTML5新特性基础学习笔记上
- HDU 1757 A Simple Math Problem 矩阵快速幂
- FORM开发:提示无效数字
- 推荐 2013 年最新的 10 款 jquery 插件
- UVa 210 - Concurrency Simulator(模拟+双端队列)
- FineReport与Web集成
- Windows 8.1下安装Mac OS X 10.8虚拟机
- 高等数学总结(完)
- SSH 原理与运用
- 编程珠玑之第三章习题8