hdu 4291 A Short problem

数学题,找循环节!!

首先g(g(g(n)))=g(x) mod 1e9+7 则可知x有循环节1e9+7;

之后x=g(g(n)),则可算出g(n)的循环节,在算出n的循环节就可以了!!

代码如下:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define mod1 1000000007
10 #define mod2 222222224
11 #define mod3 183120
12 #define mod4 240
13 using namespace std;
14 struct ma
15 {
16     ll a[2][2];
17 };
18 ma mul(ma aa,ma ab,ll mod)
19 {
20     ma ans;
21     for(int i=0;i<2;i++)
22     for(int j=0;j<2;j++){
23         ans.a[i][j]=0;
24         for(int k=0;k<2;k++)
25             ans.a[i][j]=(ans.a[i][j]+aa.a[i][k]*ab.a[k][j])%mod;
26     }
27     return ans;
28 }
29 ma pows(ma aa,ll b,ll mod)
30 {
31     ma ans;
32     ans.a[0][0]=ans.a[1][1]=1;
33     ans.a[1][0]=ans.a[0][1]=0;
34     while(b){
35         if(b&1) ans=mul(ans,aa,mod);
36         b>>=1;
37         aa=mul(aa,aa,mod);
38     }
39     return ans;
40 }
41 int main(){
42     ll n;
43     ma p;
44     p.a[0][0]=3;p.a[0][1]=p.a[1][0]=1;p.a[1][1]=0;
45     while(cin>>n){
46         ma ans;
47         if(n==0){
48             printf("0
");
49             continue;
50         }
51         ans=pows(p,n%mod4,mod3);
52         ans=pows(p,ans.a[1][0],mod2);
53         ans=pows(p,ans.a[1][0],mod1);
54         printf("%I64d
",ans.a[1][0]);
55     }
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3260668.html