A Simple Math Problem 矩阵打水题

                              A Simple Math Problem

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.
 
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.
 
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 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 1005;
19 const int SIZE = 10;
20 
21 typedef vector<vector<int> > mat;
22 
23 mat matrix(SIZE,vector<int>(SIZE));
24 
25 int n,mod;
26 
27 mat mul(mat &m1,mat &m2)
28 {
29     mat m(SIZE,vector<int>(SIZE));
30     for(int i=0;i<SIZE;i++)
31         for(int j=0;j<SIZE;j++)
32             for(int k=0;k<SIZE;k++)
33         {
34             m[i][j]=(m1[i][k]*m2[k][j]+m[i][j])%mod;
35         }
36     return m;
37 }
38 
39 mat pow(int n)
40 {
41     mat m(SIZE,vector<int>(SIZE));
42     for(int i=0;i<SIZE;i++)
43         m[i][i]=1;
44     while(n)
45     {
46         if(n&1)
47             m=mul(m,matrix);
48         matrix=mul(matrix,matrix);
49         n>>=1;
50     }
51     return m;
52 }
53 
54 int main()
55 {
56     while(scanf("%d%d",&n,&mod)!=EOF)
57     {
58         for(int i=0;i<SIZE;i++)
59             for(int j=0;j<SIZE;j++)
60                 matrix[i][j]=(i-1)==j;
61         for(int i=0;i<SIZE;i++)
62             scanf("%d",&matrix[0][i]);
63 
64         if(n<10)
65         {
66             printf("%d
",n%mod);
67             continue;
68         }
69         matrix=pow(n-9);
70         int ans=0;
71         for(int i=0;i<SIZE;i++)
72             ans+=matrix[0][i]*(9-i)%mod;
73         printf("%d
",ans%mod);
74     }
75 }
原文地址:https://www.cnblogs.com/767355675hutaishi/p/4435100.html