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 }
时间: 2024-11-05 19:05:33