A Simple Math Problem 矩阵打水题

时间:2023-03-10 05:42:57
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
A Simple Math Problem  矩阵打水题
 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",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\n",ans%mod);
74 }
75 }