提交时间:2025-02-11 10:42:35
运行 ID: 36353
#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 j=1;j<=n;j++){ a[j]^=ad; if((a[j]>>i)&1) vis[i]=1,f[i]&=a[j]; } } 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; }