fzu 1683 纪念SlingShot (矩阵优化递推,递推矩阵求和)

来源:互联网 发布:感染病毒源码 编辑:程序博客网 时间:2024/06/06 05:32


fzu 1683 纪念SlingShot


递推矩阵见此(图片来源)




#include<stdio.h>#include<string.h>#define MOD 2009struct matrix{    int m[4][4];};matrix multi(const matrix &a,const matrix &b){    matrix ans;    memset(&ans,0,sizeof(ans));    for(int i=0;i<4;i++)        for(int j=0;j<4;j++)            for(int k=0;k<4;k++)            {                ans.m[i][j]+=a.m[i][k]*b.m[k][j];                ans.m[i][j]%=MOD;            }    return ans;}matrix pow(matrix a,int k){    matrix ans;    memset(&ans,0,sizeof(ans));    for(int i=0;i<4;i++) ans.m[i][i]=1;    while(k)    {        if(k&1) ans=multi(ans,a);        a=multi(a,a);        k>>=1;    }    return ans;}int main(){    int cas,k,n;    matrix a;    scanf("%d",&cas);    for(k=1;k<=cas;k++)    {        scanf("%d",&n);        if(n==0)            printf("Case %d: 1\n",k);        else if(n==1)            printf("Case %d: 4\n",k);        else if(n==2)            printf("Case %d: 9\n",k);        else        {            memset(&a,0,sizeof(a));            a.m[0][0]=a.m[0][1]=1;            a.m[1][1]=3,a.m[1][2]=2,a.m[1][3]=7;            a.m[2][1]=1;            a.m[3][2]=1;                        a=pow(a,n-2);            int ans=(a.m[0][0]*9%MOD+a.m[0][1]*28%MOD                     +a.m[0][2]*5%MOD+a.m[0][3]*3%MOD)%MOD;            printf("Case %d: %d\n",k,ans);        }    }    return 0;}


0 0
原创粉丝点击