HDU4291 A Short problem
1 #include <map> 2 #include <iostream> 3 #define ll long long 4 using namespace std; 5 const int MOD = 1000000007; 6 struct node{ 7 long long a1,a2,a3,a4; 8 node(){} 9 node(ll a,ll b,ll c,ll d){a1=a;a2=b;a3=c;a4=d;} 10 }; 11 node gn=node(0,1,1,3); 12 node org=node(0,1,1,3); 13 node dw=node(1,0,0,1); 14 node mult(node a,node b,int mod) 15 { 16 node ans; 17 ans.a1=(a.a1*b.a1+a.a2*b.a3)%mod; 18 ans.a2=(a.a1*b.a2+a.a2*b.a4)%mod; 19 ans.a3=(a.a3*b.a1+a.a4*b.a3)%mod; 20 ans.a4=(a.a3*b.a2+a.a4*b.a4)%mod; 21 return ans; 22 } 23 node g(long long n,long long mod) 24 { 25 node ans; 26 if(n==0) return dw; 27 ans=g(n/2,mod); 28 ans=mult(ans,ans,mod); 29 if(n&1) ans=mult(ans,org,mod); 30 return ans; 31 } 32 ll calcu(int mod)//求周期用的 33 { 34 map<ll,ll> m; 35 for(int i=0;i<10000;i++) 36 m[g(i,mod).a3]=i; 37 for(int i=10000;1;i+=10000) 38 { 39 node t=g(i,mod); 40 if(m[t.a3]) 41 { 42 int ans=i-m[t.a3]; 43 if(m[g(ans,mod).a3]==0) return ans; 44 } 45 m[t.a3]=i; 46 } 47 } 48 int main() 49 { 50 ll n; 51 int ans; 52 int mod1=222222224; 53 int mod2=183120; 54 while(cin>>n) 55 { 56 ans=g(n,mod2).a3; 57 ans=g(ans,mod1).a3; 58 ans=g(ans,MOD).a3; 59 cout<<ans<<endl; 60 } 61 return 0; 62 }