P1593 因子和


传送门

思路

因数和公式+费马小定理计算乘法逆元。

代码

#include
#define MAXN 9901
using namespace std;
typedef long long LL;
int A, B, ans = 1, res[50];
struct Node { int pri, count; }prime[50];
LL fastpow(LL base, LL top)
{
    LL rel = 1;
    while (top) {
        if (top % 2)
            rel *= base, rel %= MAXN;
        base *= base;
        base %= MAXN;
        top /= 2;
    }
    return rel;
}
int Sum(LL base, LL top)
{
    int res = 0;
    if (base % MAXN == 1) {
        res = 1 + top;
    }
    else {
        res=(fastpow(base,top+1)+MAXN-1)%MAXN*(fastpow(base-1, MAXN - 2)) % MAXN;
    }
    return res % MAXN;
}
int main(void)
{
    cin >> A >> B;
    if (B == 0) {
        cout << 1; return 0;
    }
    int cnt = 0, cop = A;
    for (int i = 2; i<=A; i++)
    {
        if (cop % i == 0) {
            prime[++cnt].pri = i;
            while (cop % i == 0) {
                cop /= i;
                prime[cnt].count++;
            }
            prime[cnt].count *= B;
        }
        if (cop == 1)break;
    }
    for (int i = 1; i <= cnt; i++)
    {
        ans *= Sum(prime[i].pri, prime[i].count);
        ans %= MAXN;
    }
    cout << ans;
    return 0;
}