/************************************************************************/ | 求 a^n % b (a,b,n <= 1000000000) k is Z | 思路: a^n -> a^[ phi(b)*k + n%phi(b) ]根据欧拉定理 a^phi(b) % b ==1 | 因此可先求 b 的欧拉函数 a^(phi(b)*k)%b=1 原式变成求 a^n%phi(b) mod b /************************************************************************/ #include<iostream> #include<cmath> using namespace std; //求phi(x) int euler(int x) { int ret = x; for(int i=2; i<(int)(sqrt(1.00*x)+1); i++) { if(x%i==0) { ret = ret/i*(i-1);//公式 while(x%i==0) x /= i;//保证i一定是不同素数 } } if(x > 1) ret = ret/x*(x-1); return ret; } //计算a^n mod b b进制的最后一位 int solve(int a, int n, int b) { int phi = euler(b); int m = n%phi; int ret = 1; for(int i=1; i<=m; i++) { ret *= a; ret %= b; } return ret; } int main() { int a, n, b; while(scanf("%d%d%d", &a, &n, &b)!=EOF) { if(a==0) break; int ret = solve(a, n, b); printf("%d/n", ret); } return 0; }