样例过,但是 #1 就 WA
#include <iostream>
#define MAXN 1000005
using namespace std;
bool vis[1000005];
int pre[1000005], cnt[26]; // cnt[i] 表示 [2^i, 2^i+1)中的质数个数
void init() {
for (int i = 2; i * i <= MAXN; i++) { // 埃氏筛
if (!vis[i]) {
for (int j = i; i * j <= MAXN; j++) {
vis[i * j] = true;
}
}
}
for (int i = 2; i <= MAXN; i++) {
if (!vis[i]) pre[++pre[0]] = i; // pre[0] 表示质数
}
for (int i = 1; i <= pre[0]; i++) { // 计算 i 对 cnt 的贡献
for (int j = 24; j >= 0; j--) { // 计算 i 对 cnt[j] 的贡献
if (pre[i] & (1 << j)) {
cnt[j]++;
break;
}
}
}
}
int main(int argc, const char * argv[]) {
// insert code here...
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
init();
int T;
cin >> T;
while (T--) {
int x;
cin >> x;
int ans = 0;
for (int i = 24; i >= 0; i--) {
if (x & (1 << i)) {
ans += cnt[i];
}
}
cout << ans << '\n';
}
return 0;
}