fork download
  1. #include <bits/stdc++.h>
  2. constexpr int mod = 1e9+7, LG = 20, N = 1<<LG;
  3. int a[N], dp[N], c[N];
  4.  
  5. long long fp(long long b, int e){
  6. if(e) return fp(b*b% mod, e>>1) * (e&1?b:1) % mod;
  7. return 1;
  8. }
  9.  
  10. signed main() {
  11. std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr);
  12.  
  13. int n;
  14. std::cin >> n;
  15. for(int i=0; i<n; ++i)
  16. std::cin >> a[1<<i];
  17.  
  18. for(int i=0; i<LG; ++i)
  19. for(int mask=0; mask<N; ++mask)
  20. if(mask & (1<<i))
  21. a[mask] = (a[mask] + a[mask^(1<<i)]) % mod;
  22.  
  23. for(int k=1; k<=LG; ++k){
  24. memset(c, 0, sizeof c);
  25. for(int mask = 0; mask < N; ++mask)
  26. if(__builtin_popcount(mask) == k)
  27. c[mask] = dp[mask] = ((a[mask] + dp[mask]) % mod) * fp((fp(2, k)+mod-1)%mod, mod-2) % mod;
  28.  
  29. for(int bit = 0; bit < LG; ++bit)
  30. for(int mask = 0; mask < N; ++mask)
  31. if(mask & (1<<bit))
  32. c[mask] = (c[mask] + c[mask ^ (1<<bit)]) % mod;
  33.  
  34. for(int mask = 0; mask < N; ++mask)
  35. if(__builtin_popcount(mask) > k)
  36. dp[mask] = (dp[mask] + c[mask]) % mod;
  37. }
  38.  
  39. std::cout << dp[(1<<n)-1] << '\n';
  40. }
  41.  
Success #stdin #stdout 1.59s 15828KB
stdin
4
1 2 4 8
stdout
428571437