对一个正整数N,欧拉函数是小于N且与N互质的数的个数.。
题目: https://www.luogu.org/problemnew/show/P2158
题解:
裸的欧拉函数题。e(i)为有多少个小于i的与i互质的数。可以把点看做坐标轴。求左下角的点是(1,1),然后求有多少个点(1,1)相连斜率不同的一次函数y=kx。求k的个数。因为k=y/x。想要y/x不同,y与x一定互质(k=y/x=yz/xz),不同的互质数相除又一定不同。所以只要求在n范围内有多少对x,y互质。就相当于求ans+=e[i] (2<=i<=n)。第一列和第一行特殊考虑,ans=2。n–。再求ans+=e[i] (2<=i<=n)即可。
#includeusing namespace std;
int main()
{
int n;
int e[40005];
cin>>n;
if(n==1)
{//特判
cout<<0;
return 0;
}
for(int i=1;i<=n;i++) e[i]=i;
for(int i=2;i<=n;i++)
if(e[i]==i){
for(int j=i;j<=n;j+=i)
e[j]=e[j]/i*(i-1);
}
int ans=0;
for(int i=2;i
模板:
int euler(int n){ //返回euler(n)
int res=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
//筛选法打欧拉函数表
#define Max 1000001
int euler[Max+1];
void Init(){
for(int i=1;i<=Max;i++)
euler[i]=i;
for(int i=2;i<=Max;i++)
if(euler[i]==i)
for(int j=i;j<=Max;j+=i)
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
https://blog.csdn.net/nan81962325/article/details/79964951
https://blog.csdn.net/qq_39520417/article/details/81940687