提交时间:2025-02-11 17:10:53
运行 ID: 36363
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const long long inf = (1ll << 40) - 1; int n; long long limit[45], s[N], ok[45], f[1 << 21], ans; bool book[45]; inline void dfs(int x, long long y) { if(x >= 40) { ans += f[((1ll << 20) - 1) & y]; return; } dfs(x + 1, y); if(book[x] && (y & (1ll << x))) dfs(x + 1, y & ok[x]); } int main() { freopen("1.in", "r", stdin); freopen("2.out", "w", stdout); long long gca = inf; scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%lld", s + i); gca &= s[i]; //cout << i << " " << gca << endl; } for(int i = 39; ~i; --i) ok[i] = limit[i] = inf; for(int j = n; j; --j) { s[j] ^= gca; for(int i = 39; ~i; --i) if((s[j] >> i) & 1) limit[i] &= s[j], book[i] = 1; } //for(int i = 2; ~i; --i) cout << i << " " << limit[i] << " " << book[i] << endl; for(int i = 39; ~i; --i) for(int j = 39; ~j; --j) if(((i ^ j) || !book[i]) && (((limit[i] & limit[j]) == limit[i]) || ((limit[i] & limit[j]) == limit[j]))) ok[i] &= inf ^ (1ll << j), ok[j] &= inf ^ (1ll << i); //for(int i = 9; ~i; --i) cout << i << " " << ok[i] << endl; for(int i = (1 << 20) - 1; ~i; --i) { bool flag = 1; for(int k = 19; ~k; --k) { if((i & (1ll << k)) && ((ok[k] & i) ^ i)) { flag = 0; break; } } f[i] = flag; } for(int k = 0; k < 20; ++k) for(int i = (1ll << 20) - 1; ~i; --i) if(i & (1ll << k)) f[i] += f[i ^ (1ll << k)]; dfs(20, inf); printf("%lld", ans); return 0; }