提交时间:2024-07-19 15:45:20
运行 ID: 30454
#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; ll mod=1e9+7; ll fac[N],ifac[N]; int n,m; ll 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); }ll qp(ll a,ll b){ ll x=1; while(b){ if(b&1) x=x*a%mod; a=a*a%mod,b>>=1; }return x; }ll A(int u,int d){ if(u>d) return 0; return fac[d]*ifac[d-u]%mod; } void init(){ cin>>n>>m; fac[0]=1; for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod; for(int i=0;i<=n;i++) ifac[i]=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; ll ct=fac[n-e1-e2-e3]*A(e1,n-x)%mod*A(e2,x-1)%mod; ll dt=ct*e1%mod*(n+x+1)%mod*g2%mod; ll dc=ct*e2%mod*x%mod*g2%mod; ll dv=ct*x*e3%mod; ans=(ans+dc+dt+dv)%mod; } cout<<ans<<'\n'; } } int main(){ slv(); return 0; }