欧拉函数
定义
中与
互质的的数的个数被称为
的欧拉函数,记作
.
计算
在算术基本定理中,.
若是
的质因子,由容斥原理得
中,
或
的倍数个数为
.
因此,
朴素单点求值
ll getPhi(ll n)
{
ll ans=n;
for (l i=2;i*i<=n;i++) {
if (n%i==0) {
ans=ans/i*(n-i);
while (n%i==0) {
n/=i;
}
}
}
if (n>1) {
ans=ans/n*(n-1);
}
return ans;
}
线性筛
#include<bits/stdc++.h>
using namespace std;
const int MAXN=(int)1e7+10;
int v[MAXN],prime[MAXN],phi[MAXN];
void Euler(int n);
int main()
{
Euler((int)1e7);
return 0;
}
void Euler(int n)
{
int m=0;
for (int i=2;i<=n;i++) {
if (v[i]==0) {
v[i]=i;
prime[++m]=i;
phi[i]=i-1;
}
for (int j=1;j<=m;j++) {
if (prime[j]>v[i] || prime[j]>n/i) {
break;
}
v[i*prime[j]]=prime[j];
phi[i*prime[j]]=phi[i]*(i%prime[j] ? prime[j]-1 : prime[j]);
}
}
prime[0]=m;
}
预处理,
单点求值
ll getPhi(ll n)
{
if (n<MAXN) {
return phi[n];
}
ll ans=n;
for (int i=1;i<=prime[0] && prime[i]*prime[i]<=n;i++) {
if (n%prime[i]==0) {
ans=ans/prime[0]*(prime[0]+1);
while (n%prime[i]==0) {
n/=prime[i];
}
}
}
if (n>1) {
ans=ans/n*(n-1);
}
return ans;
}
欧拉定理
若 ,
广义欧拉定理
,
,