#include <iostream>
#include <cstdio>
#include<algorithm>
#define MaxN 100005
using namespace std;
//求单值n的欧拉函数 : O(logn)
int eula(int n){
int ret=n;
for(int i=2;i*i<=n;i++)
if(n%i==0){
ret=ret-ret/i;
while(n%i==0) n/=i;
}
if(n!=1) ret=ret-ret/n;
return ret;
}
//求单值n的所有约数(包括1和n): O(logn)
int yue[100005];
int yCnt;
void yueshu(int n){
yCnt=0;
memset(yue,0,sizeof(yue));
for(int i=1;i*i<=n;i++)
if(n%i==0){
yue[yCnt++]=i;
if(i*i!=n) yue[yCnt++]=n/i;
}
}
//筛法求素数表 1~100005以内的
bool p[MaxN+5];
int pr[MaxN+5];
int pCnt;
void primeTable(){
memset(p,true,sizeof(p));
p[1]=false;
for(int i=2;i*i<=MaxN;i++)
if(p[i]){
for(int j=i*2;j<=MaxN;j+=i)
p[j]=false;
}
//素数表
pCnt=0;
for(int i=1;i<=MaxN;i++)
if(p[i]) pr[pCnt++]=i;
}
//利用素数表 求 欧拉函数表(1~100005):
int eu[MaxN];
void eulaTable(){
primeTable();
for(int i=1;i<=MaxN;i++)
eu[i]=i;
for(int i=0;i<pCnt;i++){
int x=pr[i];
for(int j=x;j<=MaxN;j+=x)
eu[j]=eu[j]/x*(x-1);
}
}
int main(int argc, const char * argv[]) {
int n;
while(~scanf("%d",&n)){
//printf("eula(%d) = %d\n",n,eula(n));
/*
yueshu(n);
sort(yue,yue+yCnt);
printf("%d 的所有约数:",n);
for(int i=0;i<yCnt-1;i++)
printf("%d ",yue[i]);
printf("%d\n",yue[yCnt-1]);
*/
/*
primeTable();
for(int i=0;i<pCnt;i++)
printf("%d ",pr[i]);
puts("");
*/
eulaTable();
for(int i=1;i<=MaxN;i++)
printf("%d :%d \n",i,eu[i]);
}
return 0;
}
欧拉函数 + 约数 + 素数表 + 欧拉函数表
最新推荐文章于 2020-10-30 13:20:36 发布