欧拉函数
机房一天没网。。。晚上才好
简单欧拉函数的应用。详见注释。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100000
using namespace std;
int n,prime[MAXN+5],p;
bool f[MAXN+5];
void Make(){//线性筛
memset(f,true,sizeof(f));
for (int i=2;i<=MAXN;i++){
if (f[i]) prime[++p]=i;
for (int j=1;j<=p&&prime[j]*i<=MAXN;j++){
f[prime[j]*i]=false;
if (i%prime[j]==0) break;
}
}
}
int main(){
Make();//线性筛
while (scanf("%d",&n)&&n!=0){
int ans=n;
for (int i=1;prime[i]*prime[i]<=n;i++){//求欧拉函数
if (n%prime[i]==0){
ans-=ans/prime[i];//其实就是把n给乘进去了
while (n%prime[i]==0) n/=prime[i];//把这个约数除完
}
if (n==1) break;
}
if (n>1) ans-=ans/n;//如果它还有未除尽的质数就直接计算
printf("%d\n",ans);
}
return 0;
}
作者:a1799342217 发表于2017/10/30 19:38:36 原文链接
阅读:62 评论:0 查看评论