Guest User

Untitled

a guest
Oct 18th, 2015
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. /*
  2. */
  3.  
  4. //#pragma comment(linker, "/STACK:16777216")
  5. #include <fstream>
  6. #include <iostream>
  7. #include <string>
  8. #include <complex>
  9. #include <math.h>
  10. #include <set>
  11. #include <vector>
  12. #include <map>
  13. #include <queue>
  14. #include <stdio.h>
  15. #include <stack>
  16. #include <algorithm>
  17. #include <list>
  18. #include <ctime>
  19. #include <memory.h>
  20. #include <ctime>
  21. #include <assert.h>
  22.  
  23. #define y0 sdkfaslhagaklsldk
  24. #define y1 aasdfasdfasdf
  25. #define yn askfhwqriuperikldjk
  26. #define j1 assdgsdgasghsf
  27. #define tm sdfjahlfasfh
  28. #define lr asgasgash
  29.  
  30. #define eps 1e-8
  31. #define M_PI 3.141592653589793
  32. #define bs 1000000007
  33. #define bsize 512
  34. #define MAG 600
  35.  
  36. using namespace std;
  37.  
  38. long long fact[1<<20];
  39. long long k;
  40. long long a[1<<20];
  41. long long win1[1<<20],sufwin[1<<20],win2[1<<20];
  42. long long invf[1<<20];
  43. long long ans;
  44.  
  45. long long pw(long long a,long long b)
  46. {
  47. if (b==0)
  48. return 1;
  49. if (b%2)
  50. return a*pw(a,b-1)%bs;
  51. return pw(a*a%bs,b/2);
  52. }
  53. long long inv(long long x)
  54. {
  55. return pw(x,bs-2);
  56. }
  57.  
  58. long long C(long long n,long long m)
  59. {
  60. if (m>n)
  61. return 0;
  62. long long res=fact[n];
  63. res*=invf[m];
  64. res%=bs;
  65. res*=invf[n-m];
  66. return res%bs;
  67. }
  68.  
  69. int main(){
  70. //freopen("beavers.in","r",stdin);
  71. //freopen("beavers.out","w",stdout);
  72. //freopen("F:/in.txt","r",stdin);
  73. //freopen("F:/output.txt","w",stdout);
  74. ios_base::sync_with_stdio(0);
  75. //cin.tie(0);
  76.  
  77. fact[0]=1;
  78. for (int i=1;i<=500000;i++)
  79. fact[i]=fact[i-1]*i%bs;
  80.  
  81. for (int i=0;i<=500000;i++)
  82. invf[i]=inv(fact[i]);
  83.  
  84. cin>>k;
  85. for (int i=0;i<(1<<k);i++)
  86. cin>>a[i];
  87.  
  88. int n=(1<<k);
  89.  
  90. for (int lev=0;lev<k;lev++)
  91. {
  92. for (int i=n-1;i>=0;--i)
  93. {
  94. win1[i]=C(n-i-1,(1<<lev)-1);
  95. win1[i]=win1[i]*a[i]%bs;
  96. win1[i]*=n/(1<<lev);
  97. win1[i]%=bs;
  98. win1[i]*=fact[n-(1<<lev)*2];
  99. win1[i]%=bs;
  100. win1[i]*=fact[(1<<lev)];
  101. win1[i]%=bs;
  102. win1[i]*=fact[1<<lev];
  103. win1[i]%=bs;
  104. // cout<<lev<<" %"<<i<<" "<<win1[i]<<endl;
  105. }
  106. for (int i=n-1;i>=0;--i)
  107. sufwin[i]=sufwin[i+1]+win1[i],
  108. sufwin[i]%=bs;
  109.  
  110. for (int i=n-1;i>=0;--i)
  111. {
  112. win2[i]=C(n-i-1-(1<<lev),(1<<lev)-1);
  113. win2[i]=win2[i]*a[i]%bs;
  114. ans+=sufwin[i+1]*win2[i]%bs;
  115. ans%=bs;
  116. }
  117. }
  118.  
  119. for (int i=1;i<=n;i++)
  120. ans=ans*inv(i)%bs;
  121.  
  122. cout<<ans<<endl;
  123.  
  124. //cin.get();cin.get();
  125. return 0;}
Advertisement
Add Comment
Please, Sign In to add comment