Hdu1757 - A Simple Math Problem - 矩阵快速幂

来源:互联网 发布:装修软件app 编辑:程序博客网 时间:2024/04/29 17:35
#include<stdio.h>#include<string.h>int n,m;long long k;struct JZ{int jz[50][50];};JZ mul(JZ a,JZ b){JZ ans;int i,j,k;for(i=0;i<=9;i++){for(j=0;j<=9;j++){ans.jz[i][j]=0;for(k=0;k<=9;k++){ans.jz[i][j]+=(a.jz[i][k]%m)*(b.jz[k][j]%m);}ans.jz[i][j]=ans.jz[i][j]%m;}}return ans;}JZ pow(JZ c,long long d){JZ ans;int i,j;for(i=0;i<=9;i++){for(j=0;j<=9;j++){if(j==i){ans.jz[i][j]=1;}else {ans.jz[i][j]=0;}}}while(d){if(d%2==1){ans=mul(ans,c);}c=mul(c,c);d=d/2;}return ans;}int main(){int i,j;while(scanf("%I64d%d",&k,&m)!=EOF){JZ f;for(i=0;i<=9;i++){for(j=0;j<=9;j++){if(i==0){f.jz[i][j]=j;}else{f.jz[i][j]=0;}}}JZ simple;int x;for(i=9;i>=0;i--){scanf("%d",&x);for(j=0;j<=9;j++){if(j==9){simple.jz[i][j]=x;}else if(j==i-1){simple.jz[i][j]=1;}else{simple.jz[i][j]=0;}}}if(k>9){    simple=pow(simple,k-9);f=mul(f,simple);printf("%d\n",f.jz[0][9]%m);}else{printf("%d\n",f.jz[0][k]%m);}}}

0 0
原创粉丝点击