欧拉函数求法(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;
 }
posted @ 2019-08-03 20:51  ChunhaoMo  阅读(340)  评论(0)    收藏  举报