提交时间:2024-07-19 16:31:36
运行 ID: 30508
#include<bits/stdc++.h> using namespace std; #define ll long long #define ri register #define mid (l+r)/2 const int N=4e5+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 PIII q[N]; int lim=0; inline 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]=qp(fac[i],mod-2); rt=(1+n)/2; bd(1,n,0,0); }ll ans=0; inline void dfs(int u,int ge,int ne){ //int avl=n-ge-ne; //cout<<u<<endl; 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[++lim]=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[++lim]=mpx(mpx(ge,ne),1); }void slv(){ init(); dfs(rt,0,0); for(int i=1;i<=m;i++){ ans=0;int x;scanf("%d",&x); for(int j=1;j<=lim;j++){ int e1=q[j].T1.T1,e2=q[j].T1.T2,e3=q[j].T2; int ct=1ll*fac[n-e1-e2-e3]*A(e1,n-x)%mod*A(e2,x-1)%mod; printf("%d %d %d %d\n",ct,e1,e2,x); 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("%d\n",ans); } } int main(){ slv(); return 0; }