UVa11582 Colossal Fibonacci Numbers!

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn = 10005; //如果是1005就会RE,当不确定时,最好取大点。
 7 int A[maxn];
 8 #define LL unsigned long long // 注意不能用long long, 因为long long
 9                               // 最大值只能取到2 ^63 - 1
10 LL a, b;
11 int n, mod, T, t;
12 
13 int Period()
14 {
15     A[0] = 0, A[1] = 1 % mod; //这里的取值也是要细心的。
16     int i = 2;
17     while(1)
18     {
19         A[i] = (A[i-1]+A[i-2]) % mod;
20         if(A[i] == A[0] && (A[i-1]+A[i])%mod == A[1]) return i;
21         i ++;
22     }
23     return 1;
24 }
25 
26 int Pow(int x,LL n)
27 {
28     int ans = 1;
29     while(n)
30     {
31         if(n & 1) ans *= x;
32         x *= x, n >>= 1;
33         ans %= mod, x %= mod;
34     }
35     return ans;
36 }
37 
38 int main()
39 {
40     scanf("%d", &t);
41     while(t --)
42     {
43         //scanf("%I64d %I64d %d", &a, &b, &n); 这两种方式在UVa中交都是WA,
44         //scanf("%lld %lld %d", &a, &b, &n);  特别注意当不确定时,最后用cin;
45         cin >> a >> b >> n;
46         mod = n;
47         T = Period();    //求出周期
48         mod = T;
49         int x = Pow(a%mod, b); //x为第一个周期中对应值的下标
50         printf("%d\n", A[x]);
51     }
52     return 0;
53 }
View Code

 

posted on 2015-09-06 19:39  改写历史,倾尽天下  阅读(137)  评论(0编辑  收藏  举报

导航