codeforces 449 D Jzzhu and Numbers(容斥+dp)
阿新 • • 發佈:2019-01-23
這題真的爆炸難懂...待補。
程式碼:
#include <bits/stdc++.h> using namespace std; const int mod=1e9+7; const int maxn=1e6+5; int dp[maxn]; long long p[maxn]; int main() { int n, i, j, x; cin>>n; for(i=1, p[0]=1; i<=1000000; i++)p[i]=(p[i-1]*2LL)%mod; for(i=1; i<=n; i++) { scanf("%d", &x); dp[x]++; } for(i=0; i<=20; i++) { for(j=0; j<=1000000; j++) { if((1<<i)&j)dp[j^(1<<i)]=(dp[j^(1<<i)]+dp[j])%mod; } } long long ans=0; for(j=0; j<=1000000; j++) { if(dp[j]==0)continue; long long sign=1; for(i=0; i<=20; i++)if(j&(1<<i))sign=-sign; ans=((ans+sign*(p[dp[j]]-1LL))%mod+mod)%mod; } cout<<ans<<endl; }