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 }

浙公网安备 33010602011771号