构造一个矩阵。
一开始自己的思路搓了,没有把sum值一起构造到矩阵里。
还是对矩阵不是很熟悉,接着做题。悲伤啊。。
只要是这一项由前面几项推出来的,就能放在同一个矩阵里。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define LL __int64 #define MOD 1000000007 struct matrix { LL mat[11][11]; matrix(){memset(mat,0,sizeof(mat));} }ONE; matrix mul(matrix A,matrix B) { int i,j,k; matrix C; for(i=1;i<=7;i++) { for(j=1;j<=7;j++) { for(k=1;k<=7;k++) { C.mat[i][j]=(C.mat[i][j]+A.mat[i][k]*B.mat[k][j]); } C.mat[i][j]=C.mat[i][j]%MOD; } } return C; } matrix add(matrix A,matrix B) { int i,j; for(i=1;i<=7;i++) { for(j=1;j<=7;j++) { A.mat[i][j]+=B.mat[i][j]; } A.mat[i][j]=A.mat[i][j]%MOD; } return A; } matrix powmul(matrix A,LL k) { matrix B; for(int i=1;i<=7;i++)B.mat[i][i]=1; while(k) { if(k&1)B=mul(B,A); A=mul(A,A); k>>=1; } return B; } int main() { LL n,a0,ax,ay; LL b0,bx,by; for(int i=1;i<=6;i++)ONE.mat[i][i]=1; while(~scanf("%I64d",&n)){ matrix A; matrix B; scanf("%I64d%I64d%I64d",&a0,&ax,&ay); scanf("%I64d%I64d%I64d",&b0,&bx,&by); if(n==0){ cout<<"0"<<endl; continue; } A.mat[1][1]=(ax*bx)%MOD;A.mat[1][2]=(ax*by)%MOD; A.mat[1][3]=(bx*ay)%MOD;A.mat[1][4]=1; A.mat[2][2]=ax%MOD;A.mat[2][5]=1; A.mat[3][3]=bx%MOD;A.mat[3][6]=1; for(int i=4;i<=6;i++)A.mat[i][i]=1; A.mat[7][1]=1;A.mat[7][7]=1; B.mat[1][1]=(a0*b0)%MOD;B.mat[2][1]=a0%MOD;B.mat[3][1]=b0%MOD; B.mat[4][1]=(ay*by)%MOD;B.mat[5][1]=ay%MOD;B.mat[6][1]=by%MOD; A=powmul(A,n); B=mul(A,B); cout<<B.mat[7][1]<<endl; } return 0; }