HDU1286

欧拉函数测试题

期末考试完了做下水题
更好的方法是phi[i]==i时就直接筛选,不改了

#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e4+11;;
typedef unsigned long long ll;
bool isnprime[maxn];
int prime[maxn];
ll phi[maxn];
int sai(int n){
	isnprime[0]=isnprime[1]=1;
	for(int i = 2; i*i <= n; i++){
		if(!isnprime[i]){
			for(int j = 2*i; j <= n; j+=i){
				isnprime[j]=1;
			}
		}
	}
	int cnt=0;
	for(int i = 1; i <= n; i++) if(!isnprime[i]) prime[cnt++]=i;
	return cnt;
}
void euler(int n,int pn){
	for(int i = 1; i <= n; i++) phi[i]=i;
	for(int i = 0; i < pn; i++){
		for(int j = prime[i]; j <= n; j+=prime[i]){
			phi[j]=phi[j]/prime[i]*(prime[i]-1);
		}
	}
//	for(int i = 1; i <= n; i++) cout<<i<<" "<<phi[i]<<endl; 
}
int main(){
	ios::sync_with_stdio(0);
	int cnt=sai(32768);
	euler(32768,cnt);
	int T,t; cin>>T;
	while(T--){
		cin>>t;cout<<phi[t]<<endl;
	}
	return 0;
}
posted @ 2018-01-10 00:32  Caturra  阅读(134)  评论(0)    收藏  举报