HDU1757矩阵快速幂

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #define LL long long
 6 using namespace std;
 7 const int N = 10;//矩阵大小
 8 int mod;
 9 int k;//矩阵的幂
10 int a[15];
11 
12 struct Matrix
13 {
14     LL mat[N][N];//二维数组存储矩阵
15     Matrix operator*(const Matrix &m)const
16     {
17         Matrix temp;
18         for(int i = 0; i < N;i++)
19         {
20             for(int j = 0; j < N; j++)
21             {
22                 temp.mat[i][j] = 0;
23                 for(int k = 0; k < N; k++)
24                 {
25                     temp.mat[i][j]+=mat[i][k]*m.mat[k][j]%mod;
26                     temp.mat[i][j]%=mod;
27                 }
28             }
29         }
30         return temp;
31     }
32 
33 };
34 void Init(Matrix &m)
35 {
36     memset(m.mat,0,sizeof(m.mat));
37     for(int i = 0; i < N;i++)
38         m.mat[0][i] = a[i];
39     for(int i = 1; i < N; i++)
40     {
41         m.mat[i][i-1] = 1;
42     }
43 }
44 LL qpow(Matrix &m,LL k)
45 {
46     Matrix ans;
47     memset(ans.mat,0,sizeof(ans.mat));
48     for(int i = 0; i < N; i++)
49         ans.mat[i][i] = 1;
50     while(k)
51     {
52         if(k&1)ans = ans * m;
53         m = m*m;
54         k>>=1;
55     }
56     LL sum = 0;
57     int f[10];
58     for(int i = 0; i < N; i++)
59         f[i] = N-i-1;
60     for(int i = 0; i < N; i++)
61     {
62         sum+=ans.mat[0][i]*f[i]%mod;
63         sum%=mod;
64     }
65     return sum%mod;
66 }
67 int main()
68 {
69     while(scanf("%d%d",&k,&mod)!=EOF)
70     {
71         for(int i = 0; i <= 9; i++)
72             scanf("%d",&a[i]);
73         if(k<10)
74         {
75             printf("%d\n",k%mod);
76         }
77         else
78         {
79             Matrix m;
80             Init(m);
81             cout<<qpow(m,k-9)<<endl;
82         }
83     }
84     return 0;
85 }

猜你喜欢

转载自www.cnblogs.com/--lr/p/8980570.html
今日推荐