ABC D 样例二过不去,求调
  • 板块学术版
  • 楼主ny_Dacong
  • 当前回复10
  • 已保存回复10
  • 发布时间2024/12/7 21:53
  • 上次更新2024/12/8 10:02:41
查看原帖
ABC D 样例二过不去,求调
928972
ny_Dacong楼主2024/12/7 21:53

情况一:是某个质数的八次方。

情况二:是两个质数的平方的乘积。用二分求解个数。

#include<bits/stdc++.h>
using namespace std;
long long n,fans = 0;
long long pcnt = 0,primes[2000500];
bitset<2000500> vis;
void getprimes(long long x){
	for(long long i = 2; i <= x; i++){
		if(vis[i] == 0){
			primes[++pcnt] = i;
		}
		for(long long j = 1; j <= pcnt && primes[j]*i <= x; j++){
			if(vis[primes[j]*i]){
				break;
			}
			vis[primes[j]*i] = 1;
		}
	}
	return;
}
long long getans(long long x){
	long long l = x,r = pcnt,mid,ans = x;
	while(l <= r){
		mid = l+((r-l)>>1);
		if(primes[mid]*primes[mid] <= n/primes[x]/primes[x]){
			ans = mid;
			l = mid+1;
		}else{
			r = mid-1;
		}
	}
	return ans-x;
}
int main(){
	scanf("%lld",&n);
	getprimes(sqrt(n)+1);
	fans += sqrt(sqrt(sqrt(n)));//情况一 
	fans--;//fans 记录答案 
//	for(int i = 1; i <= pcnt; i++){
//		printf("%lld ",primes[i]);
//	}
//	puts("");
	for(long long i = 1; i <= pcnt; i++){
		static long long tp;
		tp = getans(i);//二分求情况二 
		if(tp == 0){
			break;
		}
//		printf("%lld %lld %lld\n",primes[i],tp,primes[tp+i]);//调试 
		fans += tp;
	}
	printf("%lld",fans);
	return 0;
}
2024/12/7 21:53
加载中...