提交时间:2024-07-19 15:57:09
运行 ID: 30470
#include<bits/stdc++.h> using namespace std; #define ll long long #define mid (l+r)/2 const int N=3e5+10; int lc[N],rc[N]; int rt=0; int mod=1e9+7; int fac[N],ifac[N]; int n,m; int g2=5e8+4; #define mpx make_pair #define PII pair<int,int> #define PIII pair<pair<int,int>,int> #define T1 first #define T2 second map<PIII,int> q; void bd(int l,int r,int t,int op){ if(l>r) return ; int m1=mid-1,m2=mid+1; if(op==0) lc[t]=mid; else rc[t]=mid; bd(l,m1,mid,0);bd(m2,r,mid,1); }int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod,b>>=1; }return x; }int A(int u,int d){ if(u>d) return 0; return 1ll*fac[d]*ifac[d-u]%mod; } void init(){ cin>>n>>m; fac[0]=1; for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod; for(int i=0;i<=n;i++) ifac[i]=1ll*qp(fac[i],mod-2); rt=(1+n)/2; bd(1,n,0,0); }ll ans=0; void dfs(int u,int ge,int ne){ //int avl=n-ge-ne; //cout<<u<<endl; if(u<0) return ; if(u==0){ /*ll delta=fac[avl]*A(ge,n-x)%mod*A(ne,x-1)%mod; ll dt=(delta*ge%mod)*(n+x+1)%mod*qp(2,mod-2)%mod; ll dc=(delta*ne%mod)*x%mod*qp(2,mod-2)%mod; ans=(ans+dt+dc)%mod;*/ q[mpx(mpx(ge,ne),0)]++; return ; } dfs(lc[u],ge+1,ne); dfs(rc[u],ge,ne+1); /*ll delta=fac[avl-1]*A(ge,n-x)%mod*A(ne,x-1)%mod; ll dt=(delta*ge%mod)*(n+x+1)%mod*qp(2,mod-2)%mod; ll dc=(delta*ne%mod)*x%mod*qp(2,mod-2)%mod; ll dv=delta*x%mod; ans=(ans+dt+dc+dv)%mod;*/ q[mpx(mpx(ge,ne),1)]++; }void slv(){ init(); dfs(rt,0,0); for(int i=1;i<=m;i++){ ans=0;int x;cin>>x; for(auto j=q.begin();j!=q.end();j++){ int e1=j->T1.T1.T1,e2=j->T1.T1.T2,e3=j->T1.T2,e4=j->T2; int ct=1ll*fac[n-e1-e2-e3]*A(e1,n-x)%mod*A(e2,x-1)%mod*e4%mod; int dt=1ll*ct*e1%mod*(n+x+1)%mod*g2%mod; int dc=1ll*ct*e2%mod*x%mod*g2%mod; int dv=1ll*ct*x%mod*e3%mod; ans=(1ll*ans+dc+dt+dv)%mod; } printf("%lld\n",ans); } } int main(){ slv(); return 0; }