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;
}

浙公网安备 33010602011771号