纪念SlingShot 矩阵快速幂 构造矩阵

来源:互联网 发布:面料成衣模拟软件 编辑:程序博客网 时间:2024/06/05 00:09
纪念SlingShot
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ …… + F(n) mod 2009。

Input

第一行是一整数m,代表总共有m个cases。

Output

对于每个case,输出一行。格式见样例,冒号后有一个空格。

Sample Input

236

Sample Output

Case 1: 37Case 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;}


0 0
原创粉丝点击