You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
using namespace std;
|
|
|
|
|
typedef long long LL;
|
|
|
|
|
|
|
|
|
|
const int mod = 9901;
|
|
|
|
|
int A, B;
|
|
|
|
|
|
|
|
|
|
// 分解质因数
|
|
|
|
|
unordered_map<int, int> primes; // map存的是数对,key+value,默认按key由小到大排序
|
|
|
|
|
void divide(int x) {
|
|
|
|
|
for (int i = 2; i * i <= x; i++)
|
|
|
|
|
while (x % i == 0) primes[i]++, x /= i;
|
|
|
|
|
if (x > 1) primes[x]++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 快速幂
|
|
|
|
|
int qmi(int a, int b) {
|
|
|
|
|
int res = 1;
|
|
|
|
|
while (b) { // 对b进行二进制分解(我给起的名),枚举b的每一个二进制位
|
|
|
|
|
if (b & 1) res = (LL)res * a % mod;
|
|
|
|
|
a = (LL)a * a % mod;
|
|
|
|
|
b >>= 1;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 分治法求等比数列求和公式
|
|
|
|
|
int sum(int p, int k) {
|
|
|
|
|
if (k == 1) return 1; // 递归出口
|
|
|
|
|
if (k % 2 == 0) // 偶数
|
|
|
|
|
return (LL)(qmi(p, k / 2) + 1) * sum(p, k / 2) % mod;
|
|
|
|
|
return (qmi(p, k - 1) + sum(p, k - 1)) % mod; // 奇数
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
cin >> A >> B;
|
|
|
|
|
// 对A分解质因子
|
|
|
|
|
divide(A);
|
|
|
|
|
|
|
|
|
|
int res = 1;
|
|
|
|
|
for (auto it : primes) {
|
|
|
|
|
// p是质因子,k是质因子的次数
|
|
|
|
|
int p = it.first, k = it.second * B; // 约数和公式,需要到每个质因子的it.second次方*B
|
|
|
|
|
|
|
|
|
|
// res要乘上每一项, 注意这里是k + 1
|
|
|
|
|
res = (LL)res * sum(p, k + 1) % mod; // 满满的套路感
|
|
|
|
|
}
|
|
|
|
|
if (!A) res = 0; // 还要特判A是不是0,注意思考数据边界
|
|
|
|
|
cout << res << endl;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|