欧拉函数求法(N)
Posted mch5201314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉函数求法(N)相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7+5;
int p[N],oa[N];
bool vis[N];
int oula(int n)
memset(vis,0,sizeof(vis));
oa[1]=1;
int cnt=1;
for(int i=2;i<=n;i++)
if(!vis[i])
p[cnt++]=i;
oa[i]=i-1;
for(int j=1;j<cnt&&p[j]*i<=n;j++)
vis[i*p[j]] = 1;
if(i%p[j]==0)
oa[i*p[j]]=oa[i]*p[j];//该合数的所有质因子p[j]出现了两次以上
break;//若prime[j]在这个合数里出现了不止一次(i%prime[j]=0),
//也就是这个合数的所有质因子都在i里出现过
oa[i*p[j]]=oa[i]*(p[j]-1);
return cnt-1;
int main()
int n;
while(cin>>n)
int al=oula(n);
for(int i=1;i<=al;i++)
cout<<p[i]<<" \n"[i==al];
for(int i=1;i<=n;i++)
cout<<oa[i]<<" \n"[i==n];
return 0;
以上是关于欧拉函数求法(N)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法