HDU 1757 A Simple Math Problem
Chieh
posted @ 2015年8月24日 18:37
in NO Answer No Speak
, 261 阅读
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; int k,m; int F[10]; int d; struct matrix { LL e[10][10]; }; void init() { d=9; for(int i=0; i<=9; i++) { scanf("%d",&F[i]); } } matrix mul(matrix p,matrix q) { LL i,j,k; matrix c; for(i=0; i<=d; i++) { for(j=0; j<=d; j++) { c.e[i][j]=0; for(k=0; k<=d; k++) c.e[i][j]=(c.e[i][j]+p.e[i][k]*q.e[k][j])%m; } } return c; } matrix s; matrix a; void matrix_pow(LL b) { while(b) { if(b&1)s=mul(s,a); a=mul(a,a); b=b>>1; } //a矩阵的b次 返回 s矩阵 } void play() { if(k<10)printf("%d\n",k); else { for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { if(i==j) s.e[i][j]=1; else s.e[i][j]=0; } } // cout<<s.e[0][2]<<endl; for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { if(j==0) { a.e[i][j]=F[i]; } else if(i+1==j) { a.e[i][j]=1; } else { a.e[i][j]=0; } } } /* for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { cout<<a.e[i][j]<<" "; } cout<<endl; } cout<<"---------------------------"<<endl;*/ matrix_pow(k-9); /* for(int i=0; i<=9; i++) { for(int j=0; j<=9; j++) { cout<<s.e[i][j]<<" "; } cout<<endl; }*/ LL ans=0; int t=9; for(int i=0; i<=9; i++) { ans=(ans+(t*s.e[i][0])%m)%m; t--; } printf("%I64d\n",ans); } } int main() { while(scanf("%d%d",&k,&m)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }