UVA - 11582 - Colossal Fibonacci Numbers!(快速幂+打表)

f(a^b)对n求余后会有周期出现,只需找出它等同于周期中的哪一项即可。最好提前打表。

 

 1 #include<cstdio>  
 2 #include<cstring>  
 3 #include<cctype>  
 4 #include<cstdlib>  
 5 #include<cmath>  
 6 #include<iostream>  
 7 #include<sstream>  
 8 #include<iterator>  
 9 #include<algorithm>  
10 #include<string>  
11 #include<vector>  
12 #include<set>  
13 #include<map>  
14 #include<deque>  
15 #include<queue>  
16 #include<stack>  
17 #include<list>  
18 typedef long long ll;  
19 typedef unsigned long long llu;  
20 const int MAXN = 1000 + 10;  
21 const int MAXT = 10000 + 10;  
22 const int INF = 0x7f7f7f7f;  
23 const double pi = acos(-1.0);  
24 const double EPS = 1e-6;  
25 using namespace std;  
26   
27 int mp[MAXN][6 * MAXN], num[MAXN];  
28   
29 void init(){  
30     for(int i = 2; i < MAXN; ++i){  
31         mp[i][0] = 0;  
32         mp[i][1] = 1;  
33         for(int j = 2; ; ++j){  
34             mp[i][j] = (mp[i][j - 1] + mp[i][j - 2]) % i;  
35             if(mp[i][j] == 1 && mp[i][j - 1] == 0){  
36                 num[i] = j - 1;  
37                 break;  
38             }  
39         }  
40     }  
41 }  
42   
43 llu pow_mod(llu a, llu i, llu n){  
44     if(i == 0)  return 1 % n;  
45     llu tmp = pow_mod(a, i >> 1, n);  
46     tmp = tmp * tmp % n;  
47     if(i & 1)  tmp = (ll)tmp * a % n;  
48     return tmp;  
49 }  
50   
51 int main(){  
52     init();  
53     int T;  
54     llu a, b, n;  
55     scanf("%d", &T);  
56     while(T--){  
57         scanf("%llu%llu%llu", &a, &b, &n);  
58         if(n == 1 || a == 0){  
59             printf("0\n");  
60             continue;  
61         }  
62         int tmp = pow_mod(a % num[n], b, num[n]);  
63         printf("%d\n", mp[n][tmp]);  
64     }  
65     return 0;  
66 }  

 

posted @ 2016-10-25 10:33  TianTengtt  阅读(175)  评论(0)    收藏  举报