Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
36330 | andy2025 | 【S】T1 | C++ | 解答错误 | 0 | 123 MS | 9240 KB | 1505 | 2025-02-10 21:24:20 |
#include <bits/stdc++.h> using namespace std; #define ll long long const int N = 1e5 + 10; int n,vis[40]; ll a[N],f[40],lim[40],dp[1 << 20],ans,all = (1ll << 40ll) - 1ll; void dfs(int now,ll state) { if(now >= 40) { ans += dp[state & ((1ll << 20) - 1ll)]; return ; } dfs(now + 1,state); if(vis[now] && (state & (1ll << now))) { state &= lim[now]; dfs(now + 1,state); } } int main() { //freopen("set2.in.txt","r",stdin); //freopen("set.out.txt","w",stdout); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0;i < 40;i++) f[i] = (1ll << 40ll) - 1ll,lim[i] = (1ll << 40ll) - 1ll; for(int i = 1;i <= n;i++) { cin >> a[i]; all &= a[i]; } for(int i = 1;i <= n;i++) { a[i] ^= all; for(int j = 0;j < 40;j++) if(a[i] & (1ll << j)) f[j] &= a[i],vis[j] = 1; } for(int i = 0;i < 40;i++) { for(int j = 0;j < 40;j++) { if((i != j || !vis[i]) && ((f[i] & f[j]) == f[j] || (f[i] & f[j]) == f[i])) { lim[i] &= ((1ll << j) ^ ((1ll << 40ll) - 1ll)); lim[j] &= ((1ll << i) ^ ((1ll << 40ll) - 1ll)); } } } for(int S = 0;S < (1 << 20);S++) { bool flag = true; for(int i = 0;i < 20;i++) { if((S & (1 << i)) && (lim[i] & S) != S) { flag = false; break; } } if(flag) dp[S] = 1; else dp[S] = 0; } for(int i = 0;i < 20;i++) { for(int S = 0;S < (1 << 20);S++) { if(S & (1 << i)) dp[S] += dp[S ^ (1 << i)]; } } dfs(20,(1ll << 40ll) - 1ll); cout << ans; return 0; }