學習筆記:尤拉函式
阿新 • • 發佈:2021-02-10
尤拉函式定義:
單個尤拉函式求法:
int euler(int x)
{
int res=x;
for(int i=2;i<=x/i;i++)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
int main()
{
int n; cin>>n;
cout<<euler(n)<<endl;
return 0;
}
區間尤拉函式篩法:
(求1~n的尤拉函式值)
1、埃氏篩思想:
const int maxn=1e6+5;
int phi[maxn]; //phi[i]是i的尤拉函式值
void Euler(int n)
{
//首先將每個數的尤拉函式值都初始化為它自己
for(int i=1;i<=n;i++) phi[i]=i;
for(int i=2;i<=n;i++)
{
//對於每一個質數p,對2p,3p,...的尤拉函式值/p*(p-1)
if(phi[i]==i)
{
for(int j=i;j<=n;j+=i)
phi[j]=phi[j]/i*(i-1);
}
}
}
int main()
{
int n; cin>>n;
Euler(n);
return 0;
}
2、線性篩過程中求尤拉函式:
const int N = 1e6+5;
int prime[N],cnt,phi[N];
bool vis[N];
void get_euler(int n)
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j= 0;prime[j]<=n/i;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
int n; cin>>n;
get_euler(n);
return 0;
}