hdu 1757:A Simple Math Problem

来源:互联网 发布:减肥打卡软件 编辑:程序博客网 时间:2024/05/21 07:47

给定一个数x:

当 x < 10 时,f(x) = x ;

当 x >= 10 时,f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);

求 f(x) 。


可以看出这是一道用矩阵快速幂做的题。构造出下面的等式


于是求 f(x) 可转化成如下式子:


于是用快速幂求出左边的矩阵的值,再算 f(x)。


代码:

//Memory: 308K      Time: 0MS//Language: C++     Result: Accepted#include <cstdio>#include <cstring>#include <iostream>using namespace std;struct mat{    int m[15][15];    mat(){memset(m,0,sizeof(m));}};mat base,E;int K,M;mat multi(mat a,mat b){    mat t;    for(int i=0;i<=9;i++){        for(int j=0;j<=9;j++){            for(int k=0;k<=9;k++){                t.m[i][j]+=(a.m[i][k]*b.m[k][j])%M;            }            t.m[i][j]%=M;        }    }    return t;}mat pow(mat a,int k){    mat t=a,ans=E;    if(k==1) return a;    while(k){        if(k&1) ans=multi(ans,t);        t=multi(t,t);        k>>=1;    }    return ans;}int main(){    //freopen("in.txt","r",stdin);    for(int i=0;i<=9;i++){        E.m[i][i]=1;    }    while(scanf("%d%d",&K,&M)!=EOF){        memset(base.m,0,sizeof(base.m));        for(int i=9;i>=0;i--){            cin>>base.m[9][i];        }        if(K<=9){            cout<<K%M<<endl;            continue;        }        for(int i=0;i<=8;i++){            base.m[i][i+1]=1;        }        base=pow(base,K-9);        int ans=0;        for(int k=0;k<=9;k++){            ans+=(base.m[9][k]*k)%M;        }        ans%=M;        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击