P4910 帕秋莉的手环

by luogu

我们将它用dp的思想来推一下

再进一步思考

可以发现

斐波那契!

再利用上矩阵递推

(我打印出来了1~12的ans、并找到了规律

 1 #include<bits/stdc++.h>
 2 
 3 
 4 #define M 1000000007
 5 #define int long long 
 6 using namespace std;
 7 
 8 
 9 long long jz[3][3],tmp[3][3],ans[3],base[3][3];
10 long long n;
11 void zc()
12 {
13     tmp[0][0]=base[0][0];
14     tmp[0][1]=base[0][1];
15     tmp[1][0]=base[1][0];
16     tmp[1][1]=base[1][1];
17     base[0][0]=(tmp[0][0]*tmp[0][0]+tmp[0][1]*tmp[1][0])%M;
18     base[0][1]=(tmp[0][0]*tmp[0][1]+tmp[0][1]*tmp[1][1])%M;
19     base[1][0]=(tmp[1][0]*tmp[0][0]+tmp[1][1]*tmp[1][0])%M;
20     base[1][1]=(tmp[1][0]*tmp[0][1]+tmp[1][1]*tmp[1][1])%M;
21     
22     return ;
23 }
24 void jc()
25 {
26     tmp[0][0]=jz[0][0];
27     tmp[0][1]=jz[0][1];
28     tmp[1][0]=jz[1][0];
29     tmp[1][1]=jz[1][1];
30     jz[0][0]=(tmp[0][0]*base[0][0]+tmp[0][1]*base[1][0])%M;
31     jz[0][1]=(tmp[0][0]*base[0][1]+tmp[0][1]*base[1][1])%M;
32     jz[1][0]=(tmp[1][0]*base[0][0]+tmp[1][1]*base[1][0])%M;
33     jz[1][1]=(tmp[1][0]*base[0][1]+tmp[1][1]*base[1][1])%M;
34 
35 return ;
36 }
37 void ksm()
38 {
39     long long t=n;
40     while(t>0)
41     {
42         if (t&1) 
43         {
44             jc();
45         }
46         zc();
47         t>>=1;
48     }
49 
50 return ;
51 }
52 //1,3,4,7,11,18,29,47,76,123,199,322
53 //1,2,3,4,5 ,6 , 7 ,8 ,9 ,10 ,11 ,12
54 signed main()
55 {
56     ios::sync_with_stdio(false);
57     
58     int T;
59     cin>>T;
60     jz[0][0]=1;
61     jz[1][1]=1;jz[1][0]=jz[0][1]=0;
62     base[0][0]=base[0][1]=base[1][0]=1;base[1][1]=0;
63     ans[0]=ans[1]=1;
64     while(T--)
65     {
66  jz[0][0]=1;
67     jz[1][1]=1;jz[1][0]=jz[0][1]=0;
68     base[0][0]=base[0][1]=base[1][0]=1;base[1][1]=0;
69     ans[0]=ans[1]=1;
70     
71     cin>>n;
72     n--;
73     ksm();
74     cout<<(jz[0][0]+jz[0][1]+jz[0][1])%M<<endl;
75       }  
76       
77       return 0;
78 } 

 

帕秋莉!

 

posted @ 2021-05-03 17:53  Hehe_0  阅读(45)  评论(0)    收藏  举报