Title
Solution
我们枚举指数,为了保证不算重,指数枚举质数。
2
2
2的情况可以拎出来算,而且不算出现重复的情况,即
a
n
s
=
n
ans=\sqrt n
ans=n
然后对于后面的,需要判断是否在
2
2
2中被算过。
Code
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const ll prime[20]={0,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
ll n; ll ans;
map<ll,bool>b;
int main(){
scanf("%lld",&n);
ans=pow(n,0.5);
for(ll i=1;i<=18;i++){
ll g=pow(n,1.0/(prime[i]));
for(ll j=2;j<=g;j++){
ll q=pow(j,prime[i]),p=sqrt(q);
if (p*p==q||b[q]) continue;
b[q]=1; ans++;
}
}
printf("%lld",ans);
}