欧拉函数

用户头像 发布于 12 天前 88 次阅读 OI


数学3(欧拉函数)

P13880 [蓝桥杯 2023 省 Java A] 互质数的个数

看完题面后很容易想到欧拉函数,
但是 $a^b$ 是一个很大的数,
考虑一些特殊的性质:$\varphi (p^n)=(p-1)p^{n-1}$,($p$ 为质数)
所以令 $a=\prod ^n _{i=1} p_i^{\alpha _i}$,
所以 $a^b=\prod ^n _{i=1} p_i^{b\alpha _i}$
因为欧拉函数是积性函数,
所以 $\varphi (a^b)=\prod ^n _{i=1} \varphi(p_i^{b\alpha _i})=\prod ^n _{i=1} (p_i-1)p_i^{b\alpha _i-1}$
代码:

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int mod=998244353;
int a,b,ans=1;
int mi(int x,int y){
    int ans=1;
    while(y){
        if(y%2) ans*=x,ans%=mod;
        y/=2,x=x*x%mod;
    }
    return ans;
}
signed main(){
	cin>>a>>b;
	int x=a;
	for(int i=2;i*i<=a;i++){
		int p=i,arf=0;
		while(x%i==0) x/=i,arf++;
		if(arf) ans=(ans*(p-1)%mod*mi(p,arf*b-1))%mod; 
	}
	if(x>1) ans=(ans*(x-1)%mod*mi(x,b-1)%mod)%mod; 
	cout<<ans%mod;
	return 0;
}

P2568 GCD