HDU 1757 矩阵快速幂模版

来源:互联网 发布:考试宝典怎么样知乎 编辑:程序博客网 时间:2024/06/05 17:14

矩阵快速幂模版题,注意k<10的初值即可。

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>const int N=10;int k,mod,a[10];using namespace std;struct mat{    int m[N][N];    mat() {}    mat unit(){          for(int i=0;i<N;i++)                for(int j=0;j<N;j++)                  m[i][j]=i==j?1:0;          }};mat t;mat operator * (mat a,mat b){    mat res;    for(int i=0;i<N;i++)        for(int j=0;j<N;j++){            res.m[i][j]=0;            for(int k=0;k<N;k++)                res.m[i][j]+=((a.m[i][k]%mod)*(b.m[k][j]%mod))%mod;        }    return res;}mat operator ^ (mat res,int n){    res.unit();    while(n>=1){        if(n&1)            res=res*t;        n=n>>1;        t=t*t;    }    return res;}void init(){    for(int i=0;i<N;i++)        t.m[i][0]=a[i];    for(int i=0;i+1<N;i++)        t.m[i][i+1]=1;}   int main(){    //freopen("input.txt","r",stdin);    while(~scanf("%d%d",&k,&mod)){        memset(t.m,0,sizeof(t.m));        mat A;        int final=0;        for(int i=0;i<10;i++)            scanf("%d,",&a[i]);        if(k<10)            printf("%d\n",k%mod);        else{            init();            A=t^(k-9);            /*for(int i=0;i<N;i++){                for(int j=0;j<N;j++)                    printf("%d ",A.m[i][j]);            cout<<endl;            }*/           for(int i=0;i<=9;i++)                final+=(A.m[i][0]*(9-i))%mod;            final%=mod;            printf("%d\n",final);        }    }    return 0;}
0 0
原创粉丝点击