欧拉函数
题目

题目

最近两天学了欧拉函数
深刻感觉自己消元的技巧好差,什么是欧拉函数?\(φ(n)\) 表示1-n-1中所有与n互质的数 比如 φ(3)=2 φ(4)=2
第一个 如果n是素数 φ=n-1
如果gcd(a,b)=1,有\(φ(a*b)=φ(a)*φ(b)\)
gcd(a+mb,b)=gcd(a,b) //辗转相除
gcd(a,b)=d ---> gcd(a/d,b/d)=1
d|n ---> n=kd n可以被d整除
φ ( p^ k) = (p-1) * p ^( k-1 )

记住 这个与次数无关!!!
由此可以得出一个试除法求欧拉函数 还是比较好用的
int phi(int n) {
int res = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
res = res * (i - 1) / i;
while (n % i == 0)n /= i;
}
}
if (n > 1)res = res * (n - 1) / n;
return res;
}
下面介绍线性求法

由于董老师讲的太好了 我只好挪用过来了
对于第一个情况 如果能被整除 说明了i包括了其所有的质因子,当然也包括了PrimeJ,
第二张情况就是互质了 很简单
每个合数都是被最小质因子筛掉的
void euler()
{
//m*sk1=pj*i i有所有的质因子
// memset(isprime,true,sizeof isprime);
isprime[1]=1;
//
for(int i=2;i<=n;i++)
{
if(!isprime[i])
{
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
else {
//fa(pj*i)=fa(m )
phi[i*prime[j]]=(prime[j]-1)*phi[i];
}
}
}
}

浙公网安备 33010602011771号