提交时间:2024-07-19 14:16:32

运行 ID: 30427

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=3e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,P[maxn],jc[maxn],jc_inv[maxn]; int c0[maxn],c1[maxn]; map<pi,int>mp; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } int C(int n,int m){if(!n)return 1;return jc[m]*1ll*jc_inv[m-n]%mod;} void bd(int l,int r,int C0,int C1){ if(l>r)return; int mid=l+r>>1; c0[mid]=C0,c1[mid]=C1;mp[m_p(C0,C1)]++; bd(l,mid-1,C0,C1+1),bd(mid+1,r,C0+1,C1); } int calc(int l,int r){ ll res=(l+r)*1ll*(r-l+1)/2; return res%mod; } void qry(){ int x=read(),res=0; for(auto it:mp){ int ct0=it.p1.p1,ct1=it.p1.p2; if(ct0&&x==1)continue;if(ct1&&x==n)continue; int G=0; (G+=calc(1,x-1)*1ll*C(ct0,x-2)%mod*1ll*C(ct1,n-x)%mod*1ll*jc[n-1-ct0-ct1]%mod)%=mod; (G+=x*1ll*C(ct0,x-1)%mod*1ll*C(ct1,n-x)%mod*1ll*jc[n-1-ct0-ct1]%mod)%=mod; (G+=calc(x+1,n)*1ll*C(ct0,x-1)%mod*1ll*C(ct1,n-x-1)%mod*1ll*jc[n-1-ct0-ct1]%mod)%=mod; (res+=G*1ll*it.p2%mod)%=mod; } printf("%d\n",res); } void slv(){ n=read(),q=read();bd(1,n,0,0); jc[0]=jc_inv[0]=1;up(i,1,3e5)jc[i]=jc[i-1]*1ll*i%mod,jc_inv[i]=qpow(jc[i],mod-2); while(q--)qry(); }int main(){ slv(); fclose(stdin); fclose(stdout); return 0; }