HDU 1757 矩阵快速幂加速递推

来源:互联网 发布:数据采集器 编辑:程序博客网 时间:2024/05/21 06:19

题意:
已知:
当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]);        }    }}

这里写图片描述

0 0
原创粉丝点击