标签:
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 }
标签:
原文地址:http://www.cnblogs.com/767355675hutaishi/p/4435100.html