95pts求调
查看原帖
95pts求调
372980
kmhgk楼主2024/11/28 20:26

#20未知原因WA

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<map>
using namespace std;
const int N=1e6+86;
const int F=2911;
const long double nb=-1e10;
long long n;
long long k;
map<long long ,bool> mp;
long long ans=0;
long long num=0;
long long cnt=0;
void fn(){
	ans=1;
	num=0;
	for(long long  i=2;i*i*i<=n;i++){
		num=pow(i,k);
		if(num>n||num<0){
			break;
		}
		if(mp[num]==0){
			num=num;
			if(num<=n){
				ans++;
				mp[num]=1;
			}else break;
		}
		while(num<=n/i){
			num=num*i;
			if(mp[num]==0){
				if(num<=n){
					ans++;
					mp[num]=1;
				}else break;
			}

		}
	}
	cout<<ans;
}
void fn2(){//k==2的分类 
	for(long long i=2;i*i*i<=n;i++){
		num=i*i*i;
		if(num>n||num<=0){
			break;
		}
		if(mp[num]==0){
			if(num<=n){
				if((long long)sqrtl(num)*sqrtl(num)==num){
					cnt++;
				}
				ans++;
				mp[num]=1;
			}else break;
		}
		while(num<=n/i){
			num=num*i;
			if(num>n||num<0)break;
			if(mp[num])continue;
			if((long long)sqrtl(num)*sqrtl(num)==num){
				cnt++;//完全平方数已经计算过,要减去 
			}
			ans++;
			mp[num]=1;
		}
	}
	ans+=sqrtl(n);//完全平方数的个数 
	cout<<ans-cnt;
}
int main(){
//	freopen("power6.in","r",stdin);
//	freopen("power.out","w",stdout);
	scanf("%lld%lld",&n,&k);
	//分类 
	if(k==1){
		printf("%lld",n);
	}else if(k>=3){
		fn();
	}else if(k==2){
		fn2();
	}
	return 0;
}
2024/11/28 20:26
加载中...