因子和公式 推导
我们设
f
(
x
)
f(x)
f(x) 为 x 的因数和,
x
x
x 为正数
通过唯一分解定理,可以得到:
x
=
p
1
e
1
×
p
2
e
2
×
.
.
.
×
p
k
e
k
x = p_1^{e_1} \times p_2^{e_2} \times ...\times p_k^{e_k}
x=p1e1×p2e2×...×pkek
设
x
x
x 的最小质因子为
p
p
p, 因子
p
p
p 的个数为
e
e
e,那么
x
=
p
e
∗
x
′
x = p^e * x\prime
x=pe∗x′
易得:
当
x
x
x 的因子中
p
p
p 的个数等于 0 的时候, 因子和为
f
(
x
′
)
f(x\prime)
f(x′)。推广至一般情况,当
x
x
x 的因子中
e
e
e 的时候,因子和为
p
e
∗
f
(
x
′
)
p^e * f(x\prime)
pe∗f(x′),所以
x
x
x 的所以因子和可以表示成:
f
(
x
)
=
(
p
0
+
p
1
+
.
.
.
+
p
e
)
∗
f
(
x
′
)
=
p
e
+
1
−
1
p
−
1
∗
f
(
x
′
)
f(x)=(p^0 + p^1 + ... + p^e) * f(x\prime) = \frac{p^{e + 1} - 1}{p - 1} * f(x\prime)
f(x)=(p0+p1+...+pe)∗f(x′)=p−1pe+1−1∗f(x′)
f
(
x
′
)
f(x\prime)
f(x′) 可以通过相同方法递归计算。最后可以表示成一系列等比数列和的乘积:
f
(
x
)
=
∐
i
=
1
k
p
i
e
i
+
1
−
1
p
i
−
1
f(x) = \coprod\limits_{i=1}^k \frac{p_i^{e_i + 1} - 1}{p_i - 1}
f(x)=i=1∐kpi−1piei+1−1
个人板子
#define int long long
int n;
int p[N], num[N], idx;
void div(int x)
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
p[++idx] = i;
while (x % i == 0)
num[idx]++, x /= i;
}
}
if (x > 1)
p[++idx] = x, num[idx] = 1;
}
int ksm(int a, int b)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
void solve()
{
idx = 0;
cin >> n;
if (n == 0)
{
cout << 0 << '\n';
return;
}
div(n);
int ans = 1;
for (int i = 1; i <= idx; i++)
{
int a = p[i], b = num[i] + 1;
if ((a - 1) % mod)
{
int tt = (ksm(a, b) - 1 + mod) % mod;
tt = tt * ksm(a - 1, mod - 2) % mod;
ans = ans * tt % mod;
}
else
ans = ans * b % mod;
}
cout << ans << '\n';
}
signed main()
{
buff;
solve();
}