$\text{I. }$题意
给定两个自然数$\ A\ $和$\ B$,$S\ $是$\ A^B\ $的所有约数之和,求$\ S\ \text{ mod }9901\ $的值.
$\text{II. }$题解
由算术基本定理:
$$
\displaystyle A=p_1^{k_1}p_1^{k_2}\cdots p_n^{k_n}\ \Rightarrow \ \displaystyle A^B=p_1^{k_1B}p_1^{k_2B}\cdots p_n^{k_nB}
$$
所以有:
$$
S=\left(p_1^{0}+p_1^{1}+\cdots+p_1^{k_1B}\right)\cdot\left(p_2^{0}+p_2^{1}+\cdots+p_2^{k_2B}\right)\cdots\left(p_n^{0}+p_n^{1}+\cdots+p_n^{k_nB}\right)
$$
又由等比数列的求和公式:
$$
S=\left(p_1^{0}+p_1^{1}+\cdots+p_1^{k_1B}\right)\cdot\left(p_2^{0}+p_2^{1}+\cdots+p_2^{k_2B}\right)\cdots\left(p_n^{0}+p_n^{1}+\cdots+p_n^{k_nB}\right)
$$
$$ =\displaystyle \frac{1-p_1^{k_1B+1}}{1-p_1}\cdot \frac{1-p_2^{k_2B+1}}{1-p_2}\cdot\cdots\cdot\frac{1-p_n^{k_nB+1}}{1-p_n}=\displaystyle \frac{p_1^{k_1B+1}-1}{p_1-1}\cdot \frac{p_2^{k_2B+1}-1}{p_2-1}\cdot\cdots\cdot\frac{p_n^{k_nB+1}-1}{p_n-1} $$
所以我们可以在$\ O\left(\log(A)\cdot\log(AB)\right)\ $的时间复杂度内求解;
不过这个题有几个坑,第一个是要特判$\ A=0\ $的情况;第二个是这个题的模数比较特殊,如果直接使用逆元处理除法的部分,会有结果是$\ 0\ $的情况,不过值得注意的是,等比数列求和公式,显然分母是整除分子的,那么可以通过一个简单的推导处理除法.
$$
(a/b)\ \text{ mod } m=(a\ \text{ mod }(m\cdot b))/b
$$
$\text{III. }$代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
vector<pair<LL, LL> > divide(LL x) {
vector<pair<LL,LL> > v;
for (LL i = 2; i <= x / i; ++i)
if (x % i == 0) {
LL s = 0;
while (x % i == 0) x /= i, s++;
v.push_back({i, s});
}
if (x > 1) v.push_back({x, 1});
return v;
}
LL Pow(LL a, LL n, LL m) {
LL t = 1;
for (; n; n >>= 1, a = (a * a % m))
if (n & 1) t = (t * a % m);
return t;
}
LL m = 9901, A, B, ans = 1;
int main() {
cin >> A >> B;
auto v = divide(A);
if (A == 0) ans = 0;
for (auto it : v) {
LL p = it.first, k = it.second;
ans = (ans * (((Pow(p, k * B + 1, m * (p - 1)) - 1 + m * (p - 1)) % (m * (p - 1))) / (p - 1)) % m) % m;
}
cout << ans << endl;
return 0;
}
大佬! 想问下这个公式(a/b) mod m=(a mod (m⋅b))/b, 能取代逆元吗? 我怎么感觉有这公式就不需要逆元的存在了
这个只能是在 b 能整除 a 的情使用况下,并且需要 b 不是很大,不然 m*b 就爆 long long 了。