思路:构造矩阵
a[i]*b[i]=ax*bx*a[i-1]*b[i-1]+ax*by*a[i-1]+ay*bx*b[i-1]+ay*by
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<map> 7 #define ll __int64 8 #define mod 1000000007 9 #define phi 1000000006 10 using namespace std; 11 struct ma 12 { 13 ll a[5][5]; 14 }; 15 ma mul(ma a,ma b) 16 { 17 ma ans; 18 for(int i=0;i<5;i++) 19 for(int j=0;j<5;j++){ 20 ans.a[i][j]=0; 21 for(int k=0;k<5;k++) 22 if(a.a[i][k]&&b.a[k][j]) 23 ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod; 24 ans.a[i][j]%=mod; 25 } 26 return ans; 27 } 28 ma pow(ma a,ll n,ma ans) 29 { 30 while(n){ 31 if(n&1) ans=mul(ans,a); 32 n>>=1; 33 a=mul(a,a); 34 } 35 return ans; 36 } 37 int main() 38 { 39 ll n,an,s,ab,a,b; 40 ll a0,b0,ax,ay,bx,by; 41 ma p,ans,re; 42 for(int i=0;i<5;i++) 43 for(int j=0;j<5;j++){ 44 p.a[i][j]=0; 45 ans.a[i][j]=0; 46 } 47 p.a[0][0]=p.a[1][0]=p.a[4][4]=1; 48 while(scanf("%I64d",&n)!=EOF){ 49 scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a0,&ax,&ay,&b0,&bx,&by); 50 p.a[1][1]=(ax*bx)%mod;p.a[3][1]=(ax*by)%mod; 51 p.a[2][1]=(ay*bx)%mod;p.a[4][1]=(ay*by)%mod; 52 p.a[2][2]=bx%mod;p.a[4][2]=by%mod; 53 p.a[3][3]=ax%mod;p.a[4][3]=ay%mod; 54 ans.a[0][1]=a0*b0%mod;ans.a[0][3]=a0%mod; 55 ans.a[0][2]=b0%mod;ans.a[0][4]=1; 56 re=pow(p,n,ans); 57 printf("%I64d ",re.a[0][0]%mod); 58 } 59 return 0; 60 }