欧拉函数入门合集(模板)
首先我们先看一下poj2407和hdu1286,这两个题几乎完全一样,是利用朴素的方法求欧拉函数,只不过poj要开long long而已
代码(以poj为例)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long getphi(long long x){
long long i,j,k,res=x;
for(long long i=2;i*i<=x;i++){
if(x%i==0)res=res*(i-1)/i;
while(x%i==0)x/=i;
}
if(x>1)res=(x-1)*res/x;
return res;
}
int main()
{ long long n,m,i,j,k,x;
cin>>x;
while(x!=0){
cout<<getphi(x)<<endl;
cin>>x;
}
return 0;
}
我们观察到hdu上的数据范围比较小,所以我们可以用线性筛欧拉函数的方法做一下
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int phi[400000],vis[400000],prime[400000],cnt;
int main()
{ int n,m,i,j,k;
for(i=2;i<=32767;i++)
if(!vis[i]){
for(j=i;j<=32767;j+=i)
vis[j]=1;
prime[++cnt]=i;
}
for(i=1;i<=32767;i++)
phi[i]=i;
for(j=1;j<=cnt;j++)
for(i=prime[j];i<=32767;i+=prime[j])
phi[i]=phi[i]*(prime[j]-1)/prime[j];
cin>>n;
for(i=1;i<=n;i++){
cin>>m;
cout<<phi[m]<<endl;
}
return 0;
}
我们再看一下poj2478,这道题经过分析就是求前n个数的欧拉函数,代码与上面几乎一样
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int n=1e6;
long long prime[n+5],phi[n+5],cnt,vis[n+5],pre[n+5];
int main()
{ long long x,i,j,k;
for(i=2;i<=n;i++)
if(!vis[i]){
prime[++cnt]=i;
for(j=i*2;j<=n;j+=i)
vis[j]=1;
}
for(i=2;i<=n;i++)phi[i]=i;
for(i=1;i<=cnt;i++)
for(j=prime[i];j<=n;j+=prime[i])
phi[j]=phi[j]*(prime[i]-1)/prime[i];
pre[1]=0;
for(i=2;i<=n;i++)pre[i]=pre[i-1]+phi[i];
scanf("%lld",&x);
while(x){
printf("%lld\n",pre[x]);
scanf("%lld",&x);
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步