问题描述
给定 a,b,求 1≤x< a b a^b ab 中有多少个 x 与 ab 互质。由于答案可能很大,你只需要输出答案对 998244353 取模的结果。
输入格式
输入一行包含两个整数分别表示 a,b,用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入 1
2 5
样例输出 1
16
样例输入 2
12 7
样例输出 2
11943936
评测用例规模与约定
对于 30% 的评测用例,ab≤ 1 0 6 10^6 106;
对于 70% 的评测用例,a≤ 1 0 6 10^6 106,b≤ 1 0 9 10^9 109;
对于所有评测用例,1<a≤ 1 0 9 10^9 109,1≤b≤ 1 0 18 10^{18} 1018。
题解
暴力求解思路不可取。
面对求互质问题,可采用欧拉函数进行求解。欧拉函数的形式为
φ
(
a
)
\varphi (a)
φ(a),表示小于等于n且与n互质的正整数的个数。
题目中要求区间[1,
a
b
a^b
ab)中与
a
b
a^b
ab互质的整数的个数,即求解
φ
(
a
b
)
\varphi (a^b)
φ(ab)。
因此,当
a
b
a^b
ab=1时,答案为0(
φ
(
1
)
\varphi (1)
φ(1)=1);其他情况下答案为
φ
(
a
b
)
\varphi (a^b)
φ(ab)。
对于
φ
(
a
b
)
\varphi (a^b)
φ(ab)的求解:
考虑到与质数相关,想到算术基本定理,将
a
b
a^b
ab分解为质数连乘的形式:
a
b
=
(
p
1
α
1
p
2
α
2
…
p
m
α
m
)
b
=
∏
i
=
1
m
p
b
⋅
α
i
{a^b} = {(p_1^{{\alpha _1}}p_2^{{\alpha _2}} \ldots p_m^{{\alpha _m}})^b} = \prod\limits_{i = 1}^m {{p^{b \cdot {\alpha _i}}}}
ab=(p1α1p2α2…pmαm)b=i=1∏mpb⋅αi(
p
i
p_i
pi均为质数)。
故有:
φ
(
a
b
)
=
∏
i
=
1
m
φ
(
p
b
⋅
α
i
)
=
∏
i
=
1
m
p
i
b
⋅
α
i
−
1
φ
(
p
i
)
=
∏
i
=
1
m
p
i
b
⋅
α
i
−
1
(
p
i
−
1
)
=
∏
i
=
1
m
p
i
b
⋅
α
i
(
1
−
1
p
i
)
=
∏
i
=
1
m
p
i
b
⋅
α
i
∏
i
=
1
m
p
(
1
−
1
p
i
)
=
a
b
∏
i
=
1
m
p
(
1
−
1
p
i
)
=
a
b
−
1
a
∏
i
=
1
m
p
(
1
−
1
p
i
)
\begin{array}{c} \varphi \left( {{a^b}} \right) = \prod\limits_{i = 1}^m {\varphi \left( {{p^{b \cdot {\alpha _i}}}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i} - 1}\varphi \left( {{p_i}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i} - 1}\left( {{p_i} - 1} \right)} \\ = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i}}\left( {1 - \frac{1}{{{p_i}}}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i}}} \prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} = {a^b}\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} \\ = {a^{b - 1}}a\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} \end{array}
φ(ab)=i=1∏mφ(pb⋅αi)=i=1∏mpib⋅αi−1φ(pi)=i=1∏mpib⋅αi−1(pi−1)=i=1∏mpib⋅αi(1−pi1)=i=1∏mpib⋅αii=1∏mp(1−pi1)=abi=1∏mp(1−pi1)=ab−1ai=1∏mp(1−pi1)
其中,
a
b
−
1
a^{b-1}
ab−1可通过快速幂求出,
a
∏
i
=
1
m
p
(
1
−
1
p
i
)
a\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)}
ai=1∏mp(1−pi1)极为
φ
(
a
)
\varphi (a)
φ(a)。
代码
import os
import sys
# 请在此输入您的代码
import math
mod = 998244353
a, b = map(int, input().split())
if a == 1 or b == 0:
print(0)
exit()
ans = pow(a, b - 1, mod)
phi = a
for i in range(2, int(a ** 0.5 + 1)):
if a % i == 0:
phi = phi // i * (i - 1)
while a % i == 0:
a //= i
if a > 1:
phi = phi // a * (a - 1)
ans = ans * phi % mod
print(ans)