求助大佬,95,悬赏一关注
查看原帖
求助大佬,95,悬赏一关注
767496
RenSiYu6楼主2023/3/12 09:56
#include<bits/stdc++.h>
#define int __int128
using namespace std;
inline int read(){
	int s=0,w=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())s=s*10+ch-'0';
	return s*w;
}
inline void write(int x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
map<int,bool> vis;
int n,k;
int sum=1;
signed main(){
	n=read(),k=read();
	if(k==1)return write(n),0;
	if(k>=60)return puts("1"),0;
	if(k>2||n<=1e12){
		for(int i=2;i<=1e6;++i){
			if(vis[i])continue;
			if(i>n)break;
			int t=i;
			bool flag=0;
			for(int j=2;j<=k;++j){
				if((__int128)t*i>n){flag=1;break;}
				if(t<=1e6)vis[t]=1;
				t*=i;
			}
			if(flag)break;
			for(int j=k;j<=59;++j){
				sum++;
				if(t<=1e6)vis[t]=1;
				if((__int128)t*i>n)break;
				t*=i;
			}
		}
		write(sum);
		return 0;
	}
	int chock=sqrt((unsigned long long)n-1),another=chock-1e6;
	for(int i=2;i<=1e6;++i){
		if(vis[i])continue;
		int t=i*i;
		for(int j=2;j<=59;++j){
			sum++;
			if(t<=1e6)vis[t]=1;
			if(t>1e6&&t<=chock)another--;
			if((__int128)t*i>n)break;
			t*=i;
		}
	}
	write(sum+another);
}
2023/3/12 09:56
加载中...