根据唯一分解定理和欧拉函数在自变量互质时的积性性质
我们可以推出
ϕ
(
n
)
=
ϕ
(
p
1
q
1
)
∗
ϕ
(
p
2
q
2
)
∗
…
∗
ϕ
(
p
m
q
m
)
\phi(n)=\phi(p_1^{q_1})*\phi(p_2^{q_2})*…*\phi(p_m^{q_m})
ϕ(n)=ϕ(p1q1)∗ϕ(p2q2)∗…∗ϕ(pmqm)
现在可以单独考虑每个
ϕ
(
p
i
q
i
)
\phi(p_i^{q_i})
ϕ(piqi)对答案的贡献
最后把
1
−
m
1-m
1−m每个
p
i
q
i
p_{i}^{q_i}
piqi的贡献加起来就可以
根据题目下方的
H
i
n
t
Hint
Hint
ϕ
(
p
q
)
\phi(p^{q})
ϕ(pq)就等于
(
p
−
1
)
∗
ϕ
(
p
q
−
1
)
(p-1)*\phi(p^{q-1})
(p−1)∗ϕ(pq−1)
题目要求多少开次欧拉函数之后结果为
1
1
1
而只有
ϕ
(
2
)
\phi({2})
ϕ(2)等于
1
1
1
我们至少需要开
q
q
q次才能把后面的那部分开完
对于前面的那部分,如果
(
p
−
1
)
(p-1)
(p−1)是质数,那么
ϕ
(
p
−
1
)
=
p
−
2
\phi({p-1})=p-2
ϕ(p−1)=p−2
否则就会被分成其他的合数
最后的要开的次数就是能开出多少个
2
2
2,因为
ϕ
(
2
)
\phi({2})
ϕ(2)才等于
1
1
1
那么我们现在需要统计每个数能这么“开”出多少个
2
2
2
设
f
[
i
]
f[i]
f[i]表示
i
i
i能“开”出
f
[
i
]
f[i]
f[i]个
2
2
2,
a
a
a与
b
b
b互质时,
f
[
a
∗
b
]
=
f
[
a
]
+
f
[
b
]
f[a*b]=f[a]+f[b]
f[a∗b]=f[a]+f[b]:
i
i
i为质数时,
f
[
i
]
=
f
[
i
−
1
]
f[i]=f[i-1]
f[i]=f[i−1]
#include <bits/stdc++.h>
#define A 100010
#define B 100000
using namespace std;
typedef long long ll;
int T, m, pri[A], cnt;
bool bz[A]; ll f[A], p, q;
int main(int argc, char const *argv[]) {
f[1] = 1;
for (int i = 2; i <= B; i++) {
if (!bz[i]) pri[++cnt] = i, f[i] = f[i - 1];
for (int j = 1; j <= cnt and i * pri[j] <= B; j++) {
bz[i * pri[j]] = 1;
f[i * pri[j]] = f[i] + f[pri[j]];
if (i % pri[j] == 0) break;
}
}
cin >> T;
while (T--) {
scanf("%d", &m); ll ans = 1;
while (m--) {
scanf("%lld%lld", &p, &q);
if (p == 2) ans--;
ans += f[p] * q;
}
printf("%lld\n", ans);
}
return 0;
}