hdu4686 Arc of Dream 矩阵快速幂
Posted 奚政
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu4686 Arc of Dream 矩阵快速幂相关的知识,希望对你有一定的参考价值。
An Arc of Dream is a curve defined by following function:
where
a0 = A0
ai = ai-1*AX+AY
b0 = B0
bi = bi-1*BX+BY
What is the value of AoD(N) modulo 1,000,000,007?
矩阵快速幂
1 #include<stdio.h>
2 #include<string.h>
3 typedef long long ll;
4 const int mod=1000000007;
5
6 struct mat{
7 int r,c;
8 ll m[6][6];
9 void clear(){
10 for(int i=1;i<=r;i++)memset(m[i],0,sizeof(m[i]));
11 }
12 };
13
14 mat MatMul(mat &m1,mat &m2){
15 mat tmp;
16 tmp.r=m1.r;
17 tmp.c=m2.c;
18 int i,j,k;
19 for(i=1;i<=tmp.r;i++){
20 for(j=1;j<=tmp.c;j++){
21 ll t=0;
22 for(k=1;k<=m1.c;k++){
23 t=(t+(m1.m[i][k]*m2.m[k][j])%mod)%mod;
24 }
25 tmp.m[i][j]=t;
26 }
27 }
28 return tmp;
29 }
30
31 mat MatQP(mat &a,ll n){
32 mat ans,tmp=a;
33 ans.r=ans.c=a.r;
34 memset(ans.m,0,sizeof(ans.m));
35 for(int i=1;i<=ans.r;i++){
36 ans.m[i][i]=1;
37 }
38 while(n){
39 if(n&1)ans=MatMul(ans,tmp);
40 n>>=1;
41 tmp=MatMul(tmp,tmp);
42 }
43 return ans;
44 }
45
46 int main(){
47 ll n;
48 mat a;
49 a.r=5,a.c=1;
50 mat tmp;
51 tmp.c=tmp.r=5;
52 ll a0,b0,ax,ay,bx,by;
53 while(scanf("%lld",&n)!=EOF){
54 scanf("%lld%lld%lld%lld%lld%lld",&a0,&ax,&ay,&b0,&bx,&by);
55 a0%=mod;
56 ax%=mod;
57 ay%=mod;
58 b0%=mod;
59 bx%=mod;
60 by%=mod;
61 a.clear();
62 a.m[1][1]=0;
63 a.m[2][1]=(a0*b0)%mod;
64 a.m[3][1]=b0;
65 a.m[4][1]=a0;
66 a.m[5][1]=1;
67 tmp.clear();
68 tmp.m[1][1]=tmp.m[1][2]=tmp.m[5][5]=1;
69 tmp.m[2][2]=(ax*bx)%mod;
70 tmp.m[2][3]=(ay*bx)%mod;
71 tmp.m[2][4]=(ax*by)%mod;
72 tmp.m[2][5]=(ay*by)%mod;
73 tmp.m[3][3]=bx;
74 tmp.m[3][5]=by;
75 tmp.m[4][4]=ax;
76 tmp.m[4][5]=ay;
77 // tmp.m[1][3]=tmp.m[1][4]=tmp.m[1][5]=tmp.m[2][1]=tmp.m[3][1]=tmp.m[3][2]=tmp.m[3][4]=tmp.m[4][1]=tmp.m[4][2]=tmp.m[4][3]=tmp.m[5][1]=tmp.m[5][2]=tmp.m[5][3]=tmp.m[5][4]=0;
78 tmp=MatQP(tmp,n);
79 a=MatMul(tmp,a);
80 printf("%lld\\n",a.m[1][1]);
81 }
82 return 0;
83 }
以上是关于hdu4686 Arc of Dream 矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章