社区讨论

奇怪的问题

P8842 [传智杯 #4 初赛] 小卡与质数 2参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lw1u6o91
此快照首次捕获于
2024/05/11 16:20
2 年前
此快照最后确认于
2024/05/11 19:37
2 年前
查看原帖
CPP
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e6+5e5;

int pre[maxn];
bool vis[maxn];
vector<int> Prime;

void isprime(){
	for(int i = 2; i < maxn-100; i++){
		if(!vis[i]) Prime.push_back(i);
		//cout << Prime.size() << " ";
		for(int j = 0; j < Prime.size(); j++){
			//cout << Prime.size() << " " << j << "\n";
			if(1ll * i * Prime[j] > maxn) break;
			vis[i*Prime[j]] = true;
			if(i % Prime[j] == 0) break;
		}
	}
}

int main(){
	int T;
	scanf("%d", &T);
	int cnt = 0;
	vis[0] = vis[1] = true;
	isprime();
	//cout << Prime.size();
	for(int i = 1; i < maxn-100; i++){
		if(!vis[i]) pre[i] = ++cnt;
		else pre[i] = cnt;
	}
	while(T--){
		int n, p = 0;
		long long ans = 0;
		scanf("%d", &n);
		while(n){
			if(n & 1){
				ans += pre[(1<<(p+1))-1] - pre[(1<<p)-1];
			}
			n >>= 1;
			p++;
		}
		printf("%lld\n", ans);
	}
	return 0;
}
这段代码把maxn 改成 2e6+5e4就是对的,这是为什么

回复

5 条回复,欢迎继续交流。

正在加载回复...