HDU 4686 Arc of Dream 矩阵快速幂
输入的数据会大于mod,当n=0时输出0.
#include<iostream> #include<vector> #include<queue> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; const ll mod = 1000000007; struct Matrix { ll da[5][5]; Matrix (){memset(da,0,sizeof(da));} Matrix operator *(const Matrix &a) { Matrix res; for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { res.da[i][j]=0; for(int k=0;k<5;k++) res.da[i][j]=(res.da[i][j]+da[i][k]*a.da[k][j])%mod; } } return res; } }base,I; Matrix f(ll n) { if(n==0)return I; if(n%2==0) { Matrix res=f(n/2); return res*res; }else { Matrix res=f(n/2); return res*res*base; } } ll n,AX,AY,BX,BY,A0,B0; int main() { while(scanf("%I64d",&n)!=EOF) { scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&A0,&AX,&AY,&B0,&BX,&BY); if(n==0){printf("0\n");continue;} base.da[0][0]=AX*BX%mod; base.da[0][1]=AX*BY%mod; base.da[0][2]=BX*AY%mod; base.da[0][3]=AY*BY%mod; base.da[0][4]=A0*B0%mod; base.da[1][1]=AX%mod; base.da[1][3]=AY%mod; base.da[1][4]=A0%mod; base.da[2][2]=BX%mod; base.da[2][3]=BY%mod; base.da[2][4]=B0%mod; base.da[3][3]=base.da[4][4]=base.da[3][4]=1; for(int i=0;i<5;i++) I.da[i][i]=1; Matrix res=f(n-1); printf("%I64d\n",((((res.da[0][0]*A0)%mod)*B0)%mod+res.da[0][1]*A0+res.da[0][2]*B0+res.da[0][3]+res.da[0][4])%mod); } return 0; }