【acmm】一道簡單的數學題
阿新 • • 發佈:2018-12-30
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 }