Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
36330 andy2025 【S】T1 C++ 解答错误 0 123 MS 9240 KB 1505 2025-02-10 21:24:20

Tests(0/12):


#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; }


测评信息: