HDU 1757 矩阵快速幂加速递推

题意:
已知:
当x<10时:f(x)=x
否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ……+ a9 * f(x-10);
求:f(x)%m的值。
思路:
矩阵快速幂加速递推。 嗯嗯

// by SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
int cases,k,ans,a[10][10],mod;
struct matrix{int a[10][10];void init(){memset(a,0,sizeof(a));}}first,cpy,td;
matrix mul(matrix &a,matrix &b,int x){
    matrix temp;temp.init();
    for(int i=0;i<10;i++)
        for(int j=0;j<x;j++)
            for(int k=0;k<10;k++)
            temp.a[i][j]=(a.a[i][k]*b.a[k][j]+temp.a[i][j])%mod;
    return temp;
}
int main(){
    while(~scanf("%d%d",&k,&mod)){
        cpy.init();first.init();
        ans=0;
        for(int i=0;i<10;i++)scanf("%d",&first.a[9][9-i]),cpy.a[9][9-i]=first.a[9][9-i];
        for(int i=0;i<9;i++)first.a[i][i+1]=cpy.a[i][i+1]=1;
        for(int i=0;i<10;i++)td.a[i][0]=i;
        if(k<10)printf("%d\n",k%mod);
        else{k-=10;
            while(k){
                if(k&1)first=mul(cpy,first,10);
                cpy=mul(cpy,cpy,10);k>>=1;
            }
            first=mul(first,td,1);
            printf("%d\n",first.a[9][0]);
        }
    }
}

这里写图片描述

posted @ 2016-07-18 21:44  SiriusRen  阅读(103)  评论(0编辑  收藏  举报