斐波那契数列。。。

利用斐波那契数列的循环:因为结果%n,所以最多有n^2个数后会出现循环。

预处理,不能直接用f[maxn][maxn^2]来保存,数组太大。。。

所以用vector来保存斐波那契数列%n 的值。

 

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <queue>
 8 using namespace std;
 9 
10 typedef unsigned long long ll;
11 
12 const int maxn=1005;
13 
14 ll pow_mod (ll a,ll b,int n){
15     ll ans=1;
16     while (b){//cout<<b<<endl;
17         if (b&(ll)1)
18             ans=(ans*a)%n;
19         a=(a*a)%n;
20         b>>=1;
21     }
22     return ans;
23 }
24 
25 vector<int> f[maxn];
26 
27 void init (){
28     for (int mod=2;mod<maxn;mod++){
29         int a,b,c;
30         a=0;b=1;c=(a+b)%mod;
31         f[mod].push_back (a);
32         f[mod].push_back (b);
33         f[mod].push_back (c);
34         while (!(b==0&&c==1)){
35             a=b;b=c;c=(a+b)%mod;
36             f[mod].push_back (c);
37         }
38         f[mod].pop_back ();
39         f[mod].pop_back ();
40         //cout<<mod<<":"<<f[mod].size()<<"    ";
41     }
42 }
43 
44 int main (){
45     int t,n;
46     ll a,b;
47     init ();
48     cin>>t;
49     //scanf ("%d",&t);
50     while (t--){
51         cin>>a>>b>>n;
52         //scanf ("%lld%lld%d",&a,&b,&n);                //cout<<a<<" "<<b<<" "<<n<<"ee";
53         if (n==1){
54             printf ("0\n");
55             continue ;
56         }
57         ll ans;
58         int mod;
59         mod=f[n].size();
60         ans=pow_mod (a%mod,b,mod);//cout<<mod<<endl;
61         //printf ("%d\n",f[n][ans%mod]);
62         cout<<f[n][ans%mod]<<endl;
63     }
64     return 0;
65 }

 

posted on 2014-08-01 16:07  gfc  阅读(191)  评论(0编辑  收藏  举报