[关闭]
@994495jj 2017-08-22T01:55:32.000000Z 字数 1124 阅读 832

cfgym100792E

201708 (ACM)数学----组合数学


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. #define dd(a) cout<<#a<<"="<<a<<" ";
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //--------
  15. const int N=(1<<18)+20;
  16. const ll mod=1e9+7;
  17. int k,n;
  18. int a[N];
  19. ll mu[N],in[N],sum[20][N];
  20. ll kpow(ll a,ll b) {
  21. ll res=1;
  22. while(b) {
  23. if(b&1) res=res*a%mod;
  24. a=a*a%mod;
  25. b>>=1;
  26. }
  27. return res;
  28. }
  29. ll inv(ll a) {
  30. return kpow(a,mod-2);
  31. }
  32. ll C(ll a,ll b) {
  33. if(a<b) return 0;
  34. return mu[a]*in[b]%mod*in[a-b]%mod;
  35. }
  36. void init() {
  37. mu[0]=1;
  38. rep(i,1,N) mu[i]=mu[i-1]*i%mod;
  39. in[N-1]=inv(mu[N-1]);
  40. for(int i=N-2;~i;--i) in[i]=in[i+1]*(i+1)%mod;
  41. rep(x,0,k) {
  42. for(int j=n;j;--j) {
  43. ll t=1ll*a[j]*C(n-j,(1<<x)-1)%mod;
  44. sum[x][j]=(sum[x][j+1]+t)%mod;
  45. }
  46. }
  47. }
  48. int main() {
  49. scanf("%d",&k);n=(1<<k);
  50. rep(i,1,n+1) scanf("%d",a+i);
  51. init();
  52. ll ans=0;
  53. rep(x,0,k) {
  54. rep(i,1,n+1) {
  55. int t=(1<<x);
  56. int tt=(((n>>x)-2)>>1)+1;
  57. ll res=sum[x][i+1]*a[i]%mod*C(n-i-t,t-1)%mod*mu[t]%mod*mu[t]%mod;
  58. res=res*tt%mod*2%mod*mu[n-t*2]%mod;
  59. ans=(ans+res)%mod;
  60. }
  61. }
  62. printf("%lld\n",ans*in[n]%mod);
  63. return 0;
  64. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注