hdu 4686 Arc of Dream

思路:构造矩阵

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 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3271084.html