Advertisement
Guest User

Untitled

a guest
Aug 27th, 2015
429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define FO(i,a,b) for (int i = (a); i < (b); i++)
  4. #define sz(v) int(v.size())
  5.  
  6. #define MOD 1000000007ll
  7.  
  8. using namespace std;
  9.  
  10. typedef long long ll;
  11.  
  12. int n;
  13. ll c[1<<17];
  14. ll pw[1<<17];
  15.  
  16. ll x[8];
  17.  
  18. ll f(vector<int> v) {
  19. int m = sz(v);
  20. FO(i,0,1<<m) x[i] = 0;
  21. FO(i,0,1<<m) {
  22. // count things that are exactly i
  23. int bmsk = 0;
  24. FO(k,0,m) if (i&(1<<k)) bmsk |= 1<<v[k];
  25. FO(j,0,1<<m) if ((i&j)==i) {
  26. int msk = 0;
  27. FO(k,0,m) if (j&(1<<k)) msk |= 1<<v[k];
  28. if (__builtin_popcount(msk^bmsk)%2) x[i] -= c[msk];
  29. else x[i] += c[msk];
  30. }
  31. }
  32.  
  33. ll res = 0;
  34. FO(i,0,1<<(1<<m)) {
  35. int msk = 0;
  36. FO(j,0,1<<m) if (i&(1<<j)) msk |= j;
  37. if (msk == (1<<m)-1) {
  38. ll tmp = 1;
  39. FO(j,0,1<<m) if (i&(1<<j)) {
  40. tmp = tmp*(pw[x[j]]-1) % MOD;
  41. }
  42. res += tmp;
  43. res %= MOD;
  44. }
  45. }
  46. return res;
  47. }
  48.  
  49. int main() {
  50. pw[0] = 1;
  51. FO(i,1,1<<17) pw[i] = pw[i-1]*2 % MOD;
  52. scanf("%d", &n);
  53. FO(i,0,n) {
  54. int a; scanf("%d", &a);
  55. c[a]++;
  56. }
  57. FO(i,0,17) FO(j,0,1<<17) {
  58. if (~j&(1<<i)) c[j] += c[j|(1<<i)];
  59. }
  60. ll res = 0;
  61. FO(i,0,17) FO(j,0,i) FO(k,0,j) res += f({i,j,k}) * pw[i+j+k] % MOD * 6 % MOD;
  62. FO(i,0,17) FO(j,0,17) if (i != j) res += f({i,j}) * pw[i+i+j] % MOD * 3 % MOD;
  63. FO(i,0,17) res += f({i}) * pw[i+i+i] % MOD;
  64. printf("%lld\n", res%MOD);
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement