求助
查看原帖
求助
1013950
__youzimo2014__楼主2024/7/14 18:32

样例过,但是 #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;
}

2024/7/14 18:32
加载中...