【矩阵快速幂】【杭电OJ1757】
http://acm.hdu.edu.cn/showproblem.php?pid=1757
A Simple Math Problem
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5829 Accepted Submission(s): 3555
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 9999
1 1 1 1 1 1 1 1 1 1
20 500
1 0 1 0 1 0 1 0 1 0
Sample Output
45 104
题目分析:看到 1)f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);【一个递推式】
2) k<2*10^9 , m < 10^5【数据超大】
就知道是矩阵快速幂了【好吧..我之前并不知道..qaq..】
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 long long n,k; 7 void mul(long long wqw[10],long long tat[10][10]) 8 { 9 long long or2[10]; 10 // cout << 11 memset(or2,0,sizeof(or2)); 12 for(int i = 0 ; i < 10 ; i++) 13 { 14 for(int j = 0 ; j < 10 ; j++) 15 { 16 or2[i]+=(wqw[j]*(tat[j][i]))%k; 17 or2[i]%=k; 18 } 19 } 20 memcpy(wqw,or2,sizeof(or2)); 21 } 22 void mulself(long long awa[10][10]) 23 { 24 long long or3[10][10]; 25 memset(or3,0,sizeof(or3)); 26 for(int i = 0; i < 10 ; i++) 27 { 28 for(int j = 0 ; j< 10 ; j++) 29 { 30 for(int kk = 0 ; kk < 10 ; kk++) 31 { 32 or3[i][j]+=((awa[i][kk])%k)*((awa[kk][j])%k)%k; 33 or3[i][j]%=k; 34 } 35 } 36 } 37 memcpy(awa,or3,sizeof(or3)); 38 } 39 int main() 40 { 41 while(scanf("%lld%lld",&n,&k)==2) 42 { 43 44 long long qaq[10][10]; 45 long long qwq[10]; 46 long long orz[10]={9,8,7,6,5,4,3,2,1,0}; 47 memset(qaq,0,sizeof(qaq)); 48 for(int i = 0 ; i < 10 ; i++) 49 { 50 scanf("%lld",&qaq[i][0]); 51 } 52 for(int i = 1 ; i < 10; i++) 53 { 54 qaq[i-1][i]=1; 55 } 56 if(n<10) 57 { 58 printf("%lld\n",n%k); 59 } 60 else 61 { 62 n=n-9; 63 while(n) 64 { 65 if(n&1)mul(orz,qaq); 66 mulself(qaq); 67 n/=2; 68 } 69 cout <<orz[0]%k<<endl; 70 } 71 } 72 return 0; 73 }