//土尔逊Torson 编写于2023/05/18 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> using namespace std; long long MyPow(long long x, long long y, int k) {//快速幂 long long answer = 1; //初始化为 1 //因为N<k 即 N <= k-1 时 N' 表示N的K进制表示的各位数字之和 //又因为 N = a0 + a1k + a2k^2 + ... N' = a0 + a1 + a2 + ... //N-N' = a1(k-1) + a2(k^2-1)... --> (N-N')%(k-1) = 0 //(x * y) % k = (x % k) * (y % k) % k //同上 因为 N'<K 所以N'= N % (k-1),如果 N%(K-1)==0,说明 N'=k-1 while (y != 0) { //不断把y转换为二进制 if (y % 2) { //若当前位为 1,累乘 x 的 2^k 次幂 answer *= x; answer %= (k - 1); //求后 k-1 位 } y /= 2; x *= x; //x 不断平方 //2^1 = 2; //2^2 = 2^1 * 2^1 = 4; //2^4 = 2^2 * 2^2 = 16; //... x %= (k - 1); //例: 9 = 1 + 8 // 23 = 1 + 2 + 4 + 16 //3^29; //29 = 1 + 4 + 8 + 16; //29(2) = 11101 //11101 = 2^0 + 2^2 + 2^3 + 2^4 //3^29 = 3^1 * 3^4 * 3^8 * 3^16 } return answer ? answer : k - 1; } int main() { long long x, y; int k; while (scanf("%lld%lld%d", &x, &y, &k) != EOF) { printf("%lld\n", MyPow(x, y, k)); } } // 64 位输出请用 printf("%lld")