fork download
  1. #include <bits/stdc++.h>
  2. constexpr int mod = 1e9+7, LG = 20, N = 1<<LG;
  3. int a[N], dp_recursive[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. int solve(int mask) {
  11. if (~dp_recursive[mask]) return dp_recursive[mask];
  12. dp_recursive[mask] = a[mask];
  13. for(int msk=(mask-1)&mask; msk; msk=(msk-1)&mask)
  14. dp_recursive[mask] = (dp_recursive[mask] + solve(msk)) % mod;
  15. int down = (fp(2, __builtin_popcount(mask)) + mod - 1) % mod;
  16. return dp_recursive[mask] = dp_recursive[mask] * fp(down, mod -2) % mod;
  17. }
  18.  
  19. signed main() {
  20. std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr);
  21. memset(dp_recursive, -1, sizeof dp_recursive);
  22.  
  23. int n;
  24. std::cin >> n;
  25. for(int i=0; i<n; ++i)
  26. std::cin >> a[1<<i];
  27.  
  28. for(int i=0; i<LG; ++i)
  29. for(int mask=0; mask<N; ++mask)
  30. if(mask & (1<<i))
  31. a[mask] = (a[mask] + a[mask^(1<<i)]) % mod;
  32.  
  33. std::cout << solve((1<<n)-1) << '\n';
  34. }
  35.  
Success #stdin #stdout 0.05s 11768KB
stdin
4
1 2 4 8
stdout
428571437