Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
36354 | Mengmohan | 【S】T3 | C++ | 通过 | 100 | 53 MS | 9232 KB | 1333 | 2025-02-11 10:54:33 |
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; const long long MAX=(1ll<<40)-1; int n; long long a[N],f[40],ft[40],ad,dp[(1<<20)+10],ans; bool vis[40]; void dfs(int x,long long now){ if(x>40){ ans+=dp[now&((1<<20)-1)]; return; } dfs(x+1,now); if(vis[x]&&((now>>x)&1)) dfs(x+1,now&ft[x]); } int main(){ scanf("%d",&n); ad=MAX; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); ad&=a[i]; } for(int i=0;i<40;i++) f[i]=MAX,ft[i]=MAX; for(int i=1;i<=n;i++){ a[i]^=ad; for(int j=0;j<40;j++){ if((a[i]>>j)&1) vis[j]=1,f[j]&=a[i]; } } for(int i=0;i<40;i++) for(int j=0;j<40;j++) if((i!=j||!vis[i])&&((f[i]&f[j])==f[i]||(f[i]&f[j])==f[j])) ft[i]&=MAX^(1ll<<j),ft[j]&=MAX^(1ll<<i); for(int now=0;now<(1<<20);now++){ bool flag=1; for(int k=0;k<20;k++) if(((now>>k)&1)&&(now&ft[k])!=now){ flag=0; break; } if(flag) dp[now]++; } for(int k=0;k<20;k++) for(int now=0;now<(1<<20);now++){ if((now>>k)&1) dp[now]+=dp[now^(1<<k)]; } dfs(20,MAX); printf("%lld\n",ans); return 0; }