笑yue了
查看原帖
笑yue了
150956
StillEmpty楼主2022/5/14 22:39

wa:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6, L = ceil(log2(N)); const int MOD = 1e9+7;
int n;
int f[N+1]; int pw2[N+1];

int diff(int a, int b) {
    if(a >= b) return a-b;
    else return a+MOD-b;
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        int a_i; scanf("%d", &a_i); ++f[a_i];
    }
    for(int i = 0; i < L; ++i) {
        int bit = 1<<i;
        for(int j = 0; j <= N; ++j) {
            if( (!(j&bit)) && j|bit <= N) f[j] += f[j|bit];
        }
    }
    pw2[0] = 1;
    for(int i = 1; i <= n; ++i) pw2[i] = (pw2[i-1]<<1)%MOD;
    for(int i = 0; i <= N; ++i) {
        f[i] = diff(pw2[f[i]], 1);
    }
    for(int i = 0; i < L; ++i) {
        int bit = 1<<i;
        for(int j = 0; j <= N; ++j) {
            if( (!(j&bit)) && j|bit <= N) f[j] = diff(f[j], f[j|bit]);
        }
    }
    printf("%d\n", f[0]);
    return 0;
}

ac:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6, L = ceil(log2(N)); const int MOD = 1e9+7;
int n;
int f[N+1]; int pw2[N+1];

int diff(int a, int b) {
    if(a >= b) return a-b;
    else return a+MOD-b;
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        int a_i; scanf("%d", &a_i); ++f[a_i];
    }
    for(int i = 0; i < L; ++i) {
        int bit = 1<<i;
        for(int j = 0; j <= N; ++j) {
            if( (!(j&bit)) && (j|bit) <= N) f[j] += f[j|bit];
        }
    }
    pw2[0] = 1;
    for(int i = 1; i <= n; ++i) pw2[i] = (pw2[i-1]<<1)%MOD;
    for(int i = 0; i <= N; ++i) {
        f[i] = diff(pw2[f[i]], 1);
    }
    for(int i = 0; i < L; ++i) {
        int bit = 1<<i;
        for(int j = 0; j <= N; ++j) {
            if( (!(j&bit)) && (j|bit) <= N) f[j] = diff(f[j], f[j|bit]);
        }
    }
    printf("%d\n", f[0]);
    return 0;
}

if( (!(j&bit)) && j|bit <= N)
if( (!(j&bit)) && (j|bit) <= N)
2022/5/14 22:39
加载中...