#include using namespace std; typedef long long LL; const int N = 10010; //质数因子个数上限,因为a的数据范围是5*10^7,开根号就是10^4肯定能装得下了 const int MOD = 9901; //要模的质数 LL res = 1; //结果,因为是要乘来乘去,初始值需要给1 int a, B; //a的b次方 // 快速幂模板[与yxc的有一点点区别,把p=MOD写在代码里了,减少了参数传入] int qmi(int a, int k) { int res = 1; //答案 while (k) { //一路让k变小直到为0停止 if (k & 1) res = (LL) res * a % MOD; //如果k的个位是1的话 k >>= 1; //右移一位 a = (LL) a * a % MOD; //1-2-4-8-16,就是每进一位,是把a=a*a,注意使用long long 防止在乘积过程中爆了int } return res; } /** * 功能:约数和公式的一部分,等比数列求和公式 * @param p * @param k * @return */ int sum(int p, int k) { int res; k *= b; //滚动生成幂次 if ((p - 1) % MOD == 0) res = (k + 1) % MOD; //当p-1是MOD倍数时,逆元不存在 res=(k+1)%MOD 就是上面推导的含义, else { //MOD是质数 int inv = qmi((p - 1) % MOD, MOD - 2); //快速幂+费马小定理求出逆元 //利用等比数列求和公式 res = (qmi(p % MOD, k + 1) - 1) % MOD * inv % MOD; } return res; } /** * 功能:分解质数因数 * @param a 待分解的数字 */ int primes[N]; //质数因子数组 int idx; //质数因子数组下标游标 int mc[N]; //mc对应着幂次 void Decomposition(int a) { //清空,防止重复 memset(primes, 0, sizeof primes); memset(mc, 0, sizeof mc); idx = 0; //开始 for (int i = 2; i * i <= a; i++) { //如果发现a的一个因子i if (a % i == 0) { primes[++idx] = i; //质因子数组维护 mc[idx] = 1; //指数幂次数+1 a /= i; //去掉这个因子 while (a % i == 0) { //除干净它 mc[idx]++; //指数幂次数+1 a /= i; //继续缩小 } } } //可能剩余一个很大的质因子数 if (a > 1) { primes[++idx] = a; mc[idx] = 1; } } int main() { //读入a和b,准备计算a^b cin >> a >> b; //对a分解质因子 Decomposition(a); //连乘,遍历所有质数因子 for (int i = 1; i <= idx; i++) res = res * sum(primes[i], mc[i]) % MOD; //输出 printf("%d\n", (res % MOD + MOD) % MOD);//测试数据14中有负数,这样写才能通过! return 0; }