Description
Input
第一行是一整数m,代表总共有m个cases。
Output
对于每个case,输出一行。格式见样例,冒号后有一个空格。
Sample Input
2 3 6
Sample Output
Case 1: 37 Case 2: 313
递推式
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define maxn using namespace std; typedef long long ll; int k, mod = 2009; int n = 4; struct Matrix { int ma[5][5]; }; Matrix multi(Matrix a, Matrix b) { Matrix ans; memset(ans.ma, 0, sizeof(ans.ma)); int i, j, k; for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) for(k=1; k<=n; ++k) ans.ma[i][j] = (ans.ma[i][j] + a.ma[i][k]*b.ma[k][j]%mod) % mod; return ans; } Matrix pow(Matrix a, int x) { Matrix ans; memset(ans.ma, 0, sizeof(ans.ma)); int i, j; for(i=1; i<=n; ++i) ans.ma[i][i] = 1; while(x) { if(x & 1) ans = multi(ans, a); a = multi(a, a); x >>= 1; } return ans; } int main() { int t, tmp = 0; int num[3] = {1, 4, 9}; Matrix ans, b; scanf("%d", &t); while(t--) { scanf("%d",&k); if(k<=2) { printf("Case %d: %d\n",++tmp, num[k]); continue; } memset(ans.ma, 0, sizeof(ans.ma)); memset(b.ma, 0, sizeof(b.ma)); ans.ma[1][1] = ans.ma[2][3] = ans.ma[3][4] = 1; ans.ma[2][1] = ans.ma[2][2] = 3; ans.ma[3][1] = ans.ma[3][2] = 2; ans.ma[4][1] = ans.ma[4][2] = 7; b.ma[1][1] = 9; b.ma[1][2] = 5; b.ma[1][3] = 3; b.ma[1][4] = 1; ans = pow(ans, k-2); ans = multi(b, ans); printf("Case %d: %d\n",++tmp, ans.ma[1][1]); } return 0; }