读书人

Number Sequence hdu 结构矩阵乘法

发布时间: 2012-09-29 10:30:01 作者: rapoo

Number Sequence hdu 构造矩阵乘法

/*题目所给的a,b和f的初始值很重要。一次来确定矩阵的元素和幂。[a b1 0]×[f(n?1)f(n?2)]=[f(n)f(n?1)][a b1 0]n?2×[11]=[f(n)f(n?1)]因为f[1]=1,f[2]=1,所以递推到n-2次幂,间接矩阵为1,1.如果初始条件改变的话,次幂也间接矩阵也会随之改变。要灵活应用。*/#include <stdio.h>#include <cstring>const int mod=7;int A[3][3],ans[3][3];void mul(int a[][3],int b[][3]){    int tmp[3][3];    for(int i=1; i<=2; i++)        for(int j=1; j<=2; j++)        {            tmp[i][j]=0;            for(int k=1; k<=2; k++)            {                tmp[i][j]+=a[i][k]*b[k][j];            }            if(tmp[i][j]>=mod) tmp[i][j]%=mod;        }    memcpy(a,tmp,sizeof(tmp));}void pow(int a[][3],int b[][3],int n){    int tmp[3][3];    memcpy(tmp,b,sizeof(int)*9);    a[1][1]=a[2][2]=1;    a[1][2]=a[2][1]=0;    while(n)    {        if(n&1)            mul(a,tmp);        mul(tmp,tmp);        n>>=1;    }}int main(){    int n,a,b;    while(scanf("%d%d%d",&a,&b,&n)==3)    {        if(a==0&&b==0&&n==0) break;        if(n<=2) printf("1\n");        else        {            memset(ans,0,sizeof(ans));            A[1][1]=a;            A[1][2]=b;            A[2][1]=1;            A[2][2]=0;            pow(ans,A,n-2);            printf("%d\n",(ans[1][2]+ans[1][1])%7);        }    }    return 0;}


读书人网 >编程

热点推荐