UVA10870-Recurrences

来源:互联网 发布:人工智能 机器人的区别 编辑:程序博客网 时间:2024/05/23 15:43


#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>using namespace std;#define ll long longll f[20],mod;struct Matrix{    ll v[20][20];    Matrix()    {        memset(v,0,sizeof v);    }}m,k,t;Matrix mul(Matrix a,Matrix b,int d){    Matrix sum;    for(int i=1; i<=d; i++)    {        for(int j=1; j<=d; j++)        {            for(int k=1; k<=d; k++)            {                sum.v[i][j]+=a.v[i][k]*b.v[k][j];                sum.v[i][j]%=mod;            }        }    }    return sum;}Matrix pow(Matrix a,int n,int d){    Matrix sum=k;    while(n)    {        if(n&1) sum=mul(sum,a,d);        n>>=1;        a=mul(a,a,d);    }    return sum;}int main(){    int d,n;    while(~scanf("%d %d %lld",&d,&n,&mod))    {        if(!d&&!n&&!mod) break;        for(int i=1;i<=d;i++)        {            scanf("%lld",&m.v[i][1]);            m.v[i][1]%=mod;        }        for(int i=1;i<=d;i++)            m.v[i][i+1]=1;        for(int i=1;i<=d;i++)        {            scanf("%lld",&f[i]);            f[i]%=mod;        }        if(n<=d) {printf("%lld\n",f[n]);continue;}        for(int i=1;i<=d;i++)            k.v[i][i]=1;        t=pow(m,n-d,d);        ll ans=0;        for(int i=1;i<=d;i++)        {            ans+=t.v[i][1]*f[d+1-i];            ans%=mod;        }        printf("%lld\n",ans);    }    return 0;}

0 0