什么是欧拉函数:
欧拉函数是 小于 xxx 的整数中与 xxx 互质的个数 , 一般用 φ(x)φ(x)φ(x) 表示。特殊的,φ(1)=1。
如何求欧拉函数:
通式:φ(n)=n∗(1−1/p1)∗(1−1/p2)∗(1−1/p3)∗...∗(1−1/pn)φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*...*(1-1/pn)φ(n)=n∗(1−1/p1)∗(1−1/p2)∗(1−1/p3)∗...∗(1−1/pn) 其中 p1,p2,p3....pnp1,p2,p3....pnp1,p2,p3....pn 为nnn 的所有质因数,n为正整数
欧拉函数的性质:
特性一:若n为质数 φ(n)=n-1
特性二:若a为质数,b%a=0,φ(ab)=φ(b)∗ab \%a=0 ,φ(ab)=φ(b)*ab%a=0,φ(ab)=φ(b)∗a
特性三:若a,b互质, φ(ab)=φ(a)∗φ(b)φ(ab)=φ(a)*φ(b)φ(ab)=φ(a)∗φ(b),特别的m=2,n为奇数时, φ(2n)= φ(n)
特性四:若n=pk,φ(n)=pk-pk-1,证明:因为p是n的唯一质因数,所以 φ(pk)=pk(1-1/p)=pk-pk-1;
特性五:不大于n且与n互质的整数和为: φ(n)∗n/2(n>1)φ(n)*n/2(n>1)φ(n)∗n/2(n>1)
特性六:n=∑{d∣n} φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn=1e6+5;
int num_prime;/** 质数个数 **/
int prime[maxn];/** 记录质数 **/
bool isnot_prime[maxn];/** 0 为质数 **/
int phi[maxn];/** 欧拉函数 **/
/** 欧拉线性筛 + 质数线性筛 **/
void Eouler(int x)
{
mem(isnot_prime,0);
isnot_prime[0]=isnot_prime[1]=1;
num_prime=0;
for(int i=2;i<=x;i++){
if(!isnot_prime[i]){/** 判断i是否为质数**/
prime[num_prime++]=i;/**记录质数**/
phi[i]=i-1;/**欧拉特性一**/
}
for(int j=0;j<num_prime&&i*prime[j]<=x;j++){
isnot_prime[i*prime[j]]=1;/**记录非质数**/
if(i%prime[j]==0){/**判断 i prime[j] 是否互质**/
phi[i*prime[j]]=phi[i]*prime[j];/**欧拉特性二**/
break;
}
else{
phi[i*prime[j]]=phi[i]*phi[prime[j]];/**欧拉特性三**/
}
}
}
}
/** 欧拉线性筛 **/
void Eouler(int x)
{
for(int i=1;i<=x;i++){
phi[i]=i;
}
for(int i=2;i<=x;i++){
if(phi[i]==i){/** 判断i是否为质数 **/
for(int j=i;j<=x;j+=i){/** 将i的倍数更新 **/
phi[j]=phi[j]/i*(i-1); /** 欧拉表达式 **/
}
}
}
}
/** 单个数的欧拉筛 **/
ll Eouler(ll x)
{
ll ans=x;
for(ll i=2;i*i<=x;i++){/** 质因数筛 欧拉表达式**/
if(x%i==0){
ans-=ans/i;
while(x%i==0){x/=i;}
}
}
if(x>1){
ans-=ans/x;
}
return ans;
}
int main()
{
return 0;
}