题目描述:
思路: 求小于等于n与n互质的个数,这与欧拉函数的定义相符。 欧拉函数
ϕ
\phi
ϕ(n),表示为小于等于n与n互质的数的个数。我们有公式:
ϕ
\phi
ϕ(n) = n
×
\times
×
∏
i
=
1
s
p
i
−
1
p
i
\prod_{i = 1}^s\frac{pi - 1}{pi}
∏i=1spipi−1,pi表示n的质因子。
所以:
ϕ
\phi
ϕ(a^b) = a^b
×
\times
×
∏
i
=
1
s
p
i
−
1
p
i
\prod_{i = 1}^s\frac{pi - 1}{pi}
∏i=1spipi−1 = a^(b - 1)
×
\times
× a
×
\times
×
∏
i
=
1
s
p
i
−
1
p
i
\prod_{i = 1}^s\frac{pi - 1}{pi}
∏i=1spipi−1 。
所以:
ϕ
\phi
ϕ(a^b) = a^b
×
\times
×
∏
i
=
1
s
p
i
−
1
p
i
\prod_{i = 1}^s\frac{pi - 1}{pi}
∏i=1spipi−1 = a^(b - 1)
×
\times
×
ϕ
\phi
ϕ(a)
我们过快速幂求a^(b - 1) 和试除法求欧拉函数 ϕ \phi ϕ(a) 即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//#define int long long
#define ios ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
const int N = 1e5+5;
const ll mod = 998244353;
ll a, b;
ll phi(ll n){
ll res = n;
for(int i = 2; i * i <= n; i++){
if(n % i == 0){
res = res/i*(i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) res = res/n*(n - 1);
return res;
}
ll qpow(ll a, ll b){
ll res = 1;
while(b){
if(b & 1) res = res * a % mod;
a = a*a%mod;
b >>= 1;
}
return res;
}
void solve(){
cin >> a >> b;
ll ans = phi(a);
ans = ans*qpow(a, b - 1)%mod;
cout << ans << endl;
}
signed main(){
ios; int _;
_ = 1; //cin >> _;
while(_--){
solve();
}
return 0;
}