hdu 1757 A Simple Math Problem (矩阵快速幂,简单)
也是和
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int num,mod; struct matrix { int a[10][10]; }; matrix multiply(matrix x,matrix y)//矩阵乘法 { matrix temp; for(int i=0;i<num;i++) { for(int j=0;j<num;j++) { int ans=0; for(int k=0;k<num;k++) { ans+=((x.a[i][k]*y.a[k][j])%mod); } temp.a[i][j]=ans%mod; } } return temp; } matrix calc(matrix origin ,matrix answ,int n)//矩阵快速幂——answ*origin^n { while(n) { if(n%2==1)//原来比赛时一直是这里被我不小心改成了0,怪不得案例一直都过不了 answ=multiply(origin,answ); origin=multiply(origin,origin); n/=2; } return answ; } int main() { int n; while(scanf("%d%d",&n,&mod)!=EOF) { matrix origin= {0,1,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,1}; matrix answ={0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0, 3,0,0,0,0,0,0,0,0,0, 4,0,0,0,0,0,0,0,0,0, 5,0,0,0,0,0,0,0,0,0, 6,0,0,0,0,0,0,0,0,0, 7,0,0,0,0,0,0,0,0,0, 8,0,0,0,0,0,0,0,0,0, 9,0,0,0,0,0,0,0,0,0}; num=10; for(int i=9;i>=0;i--)//要注意这里的a9~a0的输入顺序 scanf("%d",&origin.a[9][i]); answ=calc(origin,answ,n-9); printf("%d\n",answ.a[9][0]%mod); } return 0; }
一道又一道,好高兴!