Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FO(i,a,b) for (int i = (a); i < (b); i++)
- #define sz(v) int(v.size())
- #define MOD 1000000007ll
- using namespace std;
- typedef long long ll;
- int n;
- ll c[1<<17];
- ll pw[1<<17];
- ll x[8];
- ll f(vector<int> v) {
- int m = sz(v);
- FO(i,0,1<<m) x[i] = 0;
- FO(i,0,1<<m) {
- // count things that are exactly i
- int bmsk = 0;
- FO(k,0,m) if (i&(1<<k)) bmsk |= 1<<v[k];
- FO(j,0,1<<m) if ((i&j)==i) {
- int msk = 0;
- FO(k,0,m) if (j&(1<<k)) msk |= 1<<v[k];
- if (__builtin_popcount(msk^bmsk)%2) x[i] -= c[msk];
- else x[i] += c[msk];
- }
- }
- ll res = 0;
- FO(i,0,1<<(1<<m)) {
- int msk = 0;
- FO(j,0,1<<m) if (i&(1<<j)) msk |= j;
- if (msk == (1<<m)-1) {
- ll tmp = 1;
- FO(j,0,1<<m) if (i&(1<<j)) {
- tmp = tmp*(pw[x[j]]-1) % MOD;
- }
- res += tmp;
- res %= MOD;
- }
- }
- return res;
- }
- int main() {
- pw[0] = 1;
- FO(i,1,1<<17) pw[i] = pw[i-1]*2 % MOD;
- scanf("%d", &n);
- FO(i,0,n) {
- int a; scanf("%d", &a);
- c[a]++;
- }
- FO(i,0,17) FO(j,0,1<<17) {
- if (~j&(1<<i)) c[j] += c[j|(1<<i)];
- }
- ll res = 0;
- FO(i,0,17) FO(j,0,i) FO(k,0,j) res += f({i,j,k}) * pw[i+j+k] % MOD * 6 % MOD;
- FO(i,0,17) FO(j,0,17) if (i != j) res += f({i,j}) * pw[i+i+j] % MOD * 3 % MOD;
- FO(i,0,17) res += f({i}) * pw[i+i+i] % MOD;
- printf("%lld\n", res%MOD);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement