题意:求斐波那契数列第n项,mod10000。
解法:矩阵快速幂。矩阵递推式题里都给了……真贴心……不过我觉得第一个矩阵的第二行有点多余,就给擅自省了……嗯……
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; const int mod = 10000; void MUL(int a, int b, int c, int x[][2], int y[][2]) { int res[2][2] = {0}; for(int i = 0; i < a; i++) for(int j = 0; j < c; j++) for(int k = 0; k < b; k++) res[i][j] = (res[i][j] + x[i][k] * y[k][j]) % mod; for(int i = 0; i < a; i++) for(int j = 0; j < b; j++) x[i][j] = res[i][j]; } int POW(int n) { int x[1][2] = {1, 0}; int base[2][2] = {1, 1, 1, 0}; while(n) { if(n & 1) MUL(1, 2, 2, x, base); MUL(2, 2, 2, base, base); n >>= 1; } return x[0][1]; } int main() { int n; while(~scanf("%d", &n) && ~n) { printf("%d ", POW(n)); } return 0; }