1. 程式人生 > >【acmm】一道簡單的數學題

【acmm】一道簡單的數學題

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const LL mod = 1e9+7; 6 LL a,b,ans[2][2],now[2][2],p[2][2]; 7 8 void quickpow(int tmp,LL x) 9 { 10 if(!tmp) 11 { 12 now[0][0]=1,now[0][1]=1; 13 now[1][0]=a,now[1][1]=1; 14 } 15 else
16 { 17 now[0][0]=-1,now[0][1]=1; 18 now[1][0]=a,now[1][1]=-1; 19 } 20 ans[0][0]=1,ans[0][1]=0; 21 ans[1][0]=0,ans[1][1]=1; 22 while(x) 23 { 24 if(x&1) 25 { 26 for(int i=0;i<2;i++) 27 for(int j=0;j<2;j++) 28 p[i][j]=ans[i][j];
29 ans[0][0]=(p[0][0]*now[0][0]+p[0][1]*now[1][0])%mod; 30 ans[0][1]=(p[0][0]*now[0][1]+p[0][1]*now[1][1])%mod; 31 ans[1][0]=(p[1][0]*now[0][0]+p[1][1]*now[1][0])%mod; 32 ans[1][1]=(p[1][0]*now[0][1]+p[1][1]*now[1][1])%mod; 33 } 34 for(int i=0;i<2;i++) 35
for(int j=0;j<2;j++) 36 p[i][j]=now[i][j]; 37 now[0][0]=(p[0][0]*p[0][0]+p[0][1]*p[1][0])%mod; 38 now[0][1]=(p[0][0]*p[0][1]+p[0][1]*p[1][1])%mod; 39 now[1][0]=(p[1][0]*p[0][0]+p[1][1]*p[1][0])%mod; 40 now[1][1]=(p[1][0]*p[0][1]+p[1][1]*p[1][1])%mod; 41 x/=2; 42 } 43 } 44 45 int main() 46 { 47 //freopen("a.in","r",stdin); 48 int T; 49 scanf("%d",&T); 50 while(T--) 51 { 52 scanf("%lld%lld",&a,&b); 53 quickpow(0,2*b-1); 54 LL sum=(ans[0][0]+ans[1][0])%mod; 55 quickpow(1,2*b-1); 56 sum=((sum+(-ans[0][0]+ans[1][0])%mod)/2)%mod; 57 printf("%lld\n",sum); 58 } 59 return 0; 60 }