hdu 1757 A Simple Math Problem(矩阵连乘)

来源:互联网 发布:自定义oid取不到数据 编辑:程序博客网 时间:2024/06/14 18:28

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1757

f[10]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)*(9,8,7,6,5,4,3,2,1,0)'
f[11]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)*(f[10],9,8,7,6,5,4,3,2,1)'
f[n]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)*(f[n-1],f[n-2],f[n-3],f[n-4],f[n-5],f[n-6],f[n-7],f[n-8],f[n-9],f[n-10])' 
让我们填完左边和右边的f系列对应完整看看会发生什么:


递推式找到了,最后确定原始的f系列值:
9,8,7,6,5,4,3,2,1,0

接下来写出相应的代码即可:

#include <iostream>#include<cstdio>using namespace std;int k,m;struct matrix{    int q[10][10];};matrix I;matrix A;matrix multi(matrix a,matrix b){    matrix c={0};    for(int i=0;i<10;i++){        for(int j=0;j<10;j++){            for(int k=0;k<10;k++){                c.q[i][j]+=(a.q[i][k]%m*(b.q[k][j]%m))%m;            }        }    }    return c;}matrix power(matrix a,int po){    matrix c=I;    while(po){        if(po&1){            po--;            c=multi(c,a);        }        po>>=1;        a=multi(a,a);    }    return c;}int main(){    //freopen("cin.txt","r",stdin);    int i,j;    for(i=0;i<10;i++){        for(j=0;j<10;j++){            if(i==j)I.q[i][j]=1;            else I.q[i][j]=0;        }    }    for(i=1;i<10;i++){        A.q[i][i-1]=1;    }    while(cin>>k>>m){        for(i=0;i<10;i++){            scanf("%d",&A.q[0][i]);        }        if(k>9){            matrix rem=power(A,k-9);            int ans=0;            for(j=0;j<10;j++){                ans+=(9-j)*rem.q[0][j]%m;            }            printf("%d\n",ans%m);        }        else printf("%d\n",k%m);    }    return 0;}





0 0
原创粉丝点击