NUMTRYE - Number Theory (Easy)
Hard 版本就是用 pollard_rho 分解质因子。
f
(
n
)
=
∏
(
p
i
2
e
i
+
1
+
1
)
f(n) = \prod(p_i ^{2e_i + 1} + 1)
f(n)=∏(pi2ei+1+1),
g
(
n
)
=
∑
i
=
1
n
n
gcd
(
n
,
i
)
g(n) = \sum\limits_{i = 1} ^{n} \frac{n}{\gcd(n, i)}
g(n)=i=1∑ngcd(n,i)n,
p
i
p_i
pi是
n
n
n的质因子,
e
i
e_i
ei是
p
i
p_i
pi的次幂,求
f
(
n
)
g
(
n
)
\frac{f(n)}{g(n)}
g(n)f(n)。
∑
i
=
1
n
n
g
c
d
(
n
,
i
)
∑
d
∣
n
n
d
∑
i
=
1
n
d
[
g
c
d
(
n
d
,
i
)
=
1
]
∑
d
∣
n
d
ϕ
(
d
)
由
于
f
(
n
)
是
质
数
次
幂
形
式
,
g
(
n
)
是
一
个
积
性
函
数
,
也
考
虑
写
出
次
幂
形
式
g
(
p
)
=
1
+
p
(
p
−
1
)
,
g
(
p
k
)
=
∑
i
=
0
k
p
i
ϕ
(
p
i
)
=
∑
i
=
1
k
p
i
p
i
−
1
(
p
−
1
)
+
1
等
比
数
列
求
和
,
再
化
简
可
得
g
(
p
k
)
=
p
2
k
+
1
+
1
p
+
1
有
f
(
n
)
g
(
n
)
=
∏
(
p
i
+
1
)
\sum_{i = 1} ^{n} \frac{n}{gcd(n, i)}\\ \sum_{d \mid n} \frac{n}{d} \sum_{i = 1} ^{\frac{n}{d}} [gcd(\frac{n}{d}, i) = 1]\\ \sum_{d \mid n} d \phi(d)\\ 由于f(n)是质数次幂形式,g(n)是一个积性函数,也考虑写出次幂形式\\ g(p) = 1 + p(p - 1), g(p ^ k) = \sum_{i = 0} ^{k} p ^i \phi(p ^ i) = \sum_{i = 1} ^{k} p ^ i p ^{i - 1}(p - 1) + 1\\ 等比数列求和,再化简可得g(p ^k) = \frac{p ^{2k + 1} + 1}{p + 1}\\ 有\frac{f(n)}{g(n)} = \prod(p_i + 1)\\
i=1∑ngcd(n,i)nd∣n∑dni=1∑dn[gcd(dn,i)=1]d∣n∑dϕ(d)由于f(n)是质数次幂形式,g(n)是一个积性函数,也考虑写出次幂形式g(p)=1+p(p−1),g(pk)=i=0∑kpiϕ(pi)=i=1∑kpipi−1(p−1)+1等比数列求和,再化简可得g(pk)=p+1p2k+1+1有g(n)f(n)=∏(pi+1)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10, mod = 1000000007;
int prime[N], cnt;
bool st[N];
void init() {
for (int i = 2; i < N; i++) {
if (!st[i]) {
prime[++cnt] = i;
}
for (int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {
st[i * prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
init();
scanf("%d", &T);
while (T--) {
ll n, ans = 1;
scanf("%lld", &n);
for (int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= n; i++) {
if (n % prime[i] == 0) {
while (n % prime[i] == 0) {
n /= prime[i];
}
ans = (prime[i] + 1) * ans % mod;
}
}
if (n != 1) {
ans = (n + 1) % mod * ans % mod;
}
printf("%lld\n", ans);
}
return 0;
}