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)