因子和
题目描述
输入两个整数 a a a 和 b b b,求 a b a^b ab 的因子和。
由于结果太大,只要输出它对 9901 9901 9901 取模的结果。
输入格式
仅一行,为两个整数 a a a 和 b b b。
输出格式
输出一行一个整数表示答案对 9901 9901 9901 取模的结果。
样例 #1
样例输入 #1
2 3
样例输出 #1
15
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ a ≤ 5 × 1 0 7 1 \leq a \leq 5 \times 10^7 1≤a≤5×107, 0 ≤ b ≤ 5 × 1 0 7 0 \leq b \leq 5 \times 10^7 0≤b≤5×107。
问题链接: P1593 因子和
问题分析: 数学问题,不解释。
参考链接: (略)
题记: (略)
AC的C语言程序如下:
/* P1593 因子和 */
#include <stdio.h>
#define MOD 9901
typedef long long LL;
// 快速模幂计算函数:a^n%m
LL powmod(LL a, LL n, LL m)
{
LL res = 1;
while (n) {
if(n & 1) // n % 2 == 1
res = res * a % m;
a = a * a % m;
n >>= 1;
}
return res;
}
// 计算:(p^0 + p^1 + p^2 + ... + p^x) % MOD
LL f(LL p, LL x)
{
if(x == 0) return 1;
if(x % 2 == 1)
return f(p, x / 2) * (1 + powmod(p, x / 2 + 1, MOD)) % MOD;
else
return (f(p, x / 2 - 1) * (1 + powmod(p, x / 2 + 1, MOD)) + powmod(p, x / 2, MOD)) % MOD;
}
int main()
{
LL a, b, ans = 1;
scanf("%lld%lld", &a, &b);
for (int i = 2; i * i <= a; i++) {
int cnt = 0;
while (a % i == 0) cnt++, a /= i;
ans = ans * f(i, cnt * b) % MOD;
}
if (a > 1) ans = ans * f(a, b) % MOD;
printf("%lld", ans);
return 0;
}