POJ-2440-矩阵
来源:互联网 发布:淘宝如何设置降价通知 编辑:程序博客网 时间:2024/05/05 18:47
const int inf = 0x3f3f3f3f;const int maxn = 1009;const int mod = 2005;const double esp = 1e-6;int x[5][5]={ {1, 1, 0, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 1, 1}, {1, 0, 0, 0, 1}, {0, 0, 0, 0, 2}};int init[5]={1, 1, 1, 1, 0};int ans[5][5];int tmp[5][5];void mulans(){ int b[5][5]; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { b[i][j] = 0; for(int k=0; k<5; k++) { b[i][j] += ans[i][k]*tmp[k][j]; b[i][j] %= mod; } } } for(int i=0; i<5; i++) { for(int j=0; j<5; j++) ans[i][j] = b[i][j]; }}void multmp(){ int b[5][5]; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { b[i][j] = 0; for(int k=0; k<5; k++) { b[i][j] += tmp[i][k]*tmp[k][j]; b[i][j] %= mod; } } } for(int i=0; i<5; i++) { for(int j=0; j<5; j++) tmp[i][j] = b[i][j]; }}int main(){ int n; while(~scanf("%d", &n)) { if(n==1) {cout<<2<<endl;continue;} n -= 2; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { tmp[i][j] = x[i][j]; ans[i][j] = i==j; } } while(n) { //cout<<n<<endl; if(n&1) mulans(); multmp(); n/=2; } int over[5]={0}; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { over[i] = (over[i]+ans[i][j]*init[j])%mod; } //cout<<i<<' '<<over[i]<<endl; } printf("%d\n", (over[0]+over[1]+over[2]+over[3])%mod ); }return 0;}