Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- //#pragma comment(linker, "/STACK:16777216")
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <ctime>
- #include <assert.h>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define eps 1e-8
- #define M_PI 3.141592653589793
- #define bs 1000000007
- #define bsize 512
- #define MAG 600
- using namespace std;
- long long fact[1<<20];
- long long k;
- long long a[1<<20];
- long long win1[1<<20],sufwin[1<<20],win2[1<<20];
- long long invf[1<<20];
- long long ans;
- long long pw(long long a,long long b)
- {
- if (b==0)
- return 1;
- if (b%2)
- return a*pw(a,b-1)%bs;
- return pw(a*a%bs,b/2);
- }
- long long inv(long long x)
- {
- return pw(x,bs-2);
- }
- long long C(long long n,long long m)
- {
- if (m>n)
- return 0;
- long long res=fact[n];
- res*=invf[m];
- res%=bs;
- res*=invf[n-m];
- return res%bs;
- }
- int main(){
- //freopen("beavers.in","r",stdin);
- //freopen("beavers.out","w",stdout);
- //freopen("F:/in.txt","r",stdin);
- //freopen("F:/output.txt","w",stdout);
- ios_base::sync_with_stdio(0);
- //cin.tie(0);
- fact[0]=1;
- for (int i=1;i<=500000;i++)
- fact[i]=fact[i-1]*i%bs;
- for (int i=0;i<=500000;i++)
- invf[i]=inv(fact[i]);
- cin>>k;
- for (int i=0;i<(1<<k);i++)
- cin>>a[i];
- int n=(1<<k);
- for (int lev=0;lev<k;lev++)
- {
- for (int i=n-1;i>=0;--i)
- {
- win1[i]=C(n-i-1,(1<<lev)-1);
- win1[i]=win1[i]*a[i]%bs;
- win1[i]*=n/(1<<lev);
- win1[i]%=bs;
- win1[i]*=fact[n-(1<<lev)*2];
- win1[i]%=bs;
- win1[i]*=fact[(1<<lev)];
- win1[i]%=bs;
- win1[i]*=fact[1<<lev];
- win1[i]%=bs;
- // cout<<lev<<" %"<<i<<" "<<win1[i]<<endl;
- }
- for (int i=n-1;i>=0;--i)
- sufwin[i]=sufwin[i+1]+win1[i],
- sufwin[i]%=bs;
- for (int i=n-1;i>=0;--i)
- {
- win2[i]=C(n-i-1-(1<<lev),(1<<lev)-1);
- win2[i]=win2[i]*a[i]%bs;
- ans+=sufwin[i+1]*win2[i]%bs;
- ans%=bs;
- }
- }
- for (int i=1;i<=n;i++)
- ans=ans*inv(i)%bs;
- cout<<ans<<endl;
- //cin.get();cin.get();
- return 0;}
Advertisement
Add Comment
Please, Sign In to add comment