社区讨论
奇怪的问题
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 条回复,欢迎继续交流。
正在加载回复...