poj 2118
矩阵乘法。
(a[n],a[n+1],a[n+2])=(a[0],a[1],a[2])*A^n.
代码:
#include<iostream> #include<fstream> using namespace std; int a[110]; int map[110][110],map1[110][110],map2[110][110]; int n; long long m; void solve(long long m){ int i,j,k; if(m==1) for(i=1;i<=n;i++) for(j=1;j<=n;j++) map1[i][j]=map[i][j]; else { solve(m/2); if(m/2*2==m) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=0,map2[i][j]=0;k<=n;k++) { map2[i][j]+=map1[i][k]*map1[k][j]; map2[i][j]%=10000; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) map1[i][j]=map2[i][j]; } else { for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=0,map2[i][j]=0;k<=n;k++) { map2[i][j]+=map1[i][k]*map1[k][j]; map2[i][j]%=10000; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=0,map1[i][j]=0;k<=n;k++) { map1[i][j]+=map2[i][k]*map[k][j]; map1[i][j]%=10000; } } } } void read(){ // ifstream cin("in.txt"); int i,j,k; while(1) { cin>>n; if(n==0) return; for(i=1;i<=n;i++) cin>>a[i]; memset(map,0,sizeof(map)); for(i=n;i>=1;i--) cin>>map[i][n]; for(i=1;i<n;i++) map[i+1][i]=1; cin>>m; if(m==0) { cout<<a[1]<<endl; continue; } solve(m); long long ans=0; for(i=1;i<=n;i++) { ans+=a[i]*map1[i][1]; ans%=10000; } cout<<ans<<endl; } } int main(){ read(); return 0; }