Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38804 LYLAKIOIAKIOI 【S】T2 C++ 通过 100 611 MS 4980 KB 2284 2025-10-29 15:24:44

Tests(20/20):


#include<bits/stdc++.h> using namespace std; const int N=3e5+10,mod=1e9+7; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; b>>=1;a=1ll*a*a%mod; }return x; } int n,m; int f[22][22],g[22][22]; int pre[N],suf[N],fac[N],inv[N]; int binom[2][2][22]; int C(int u,int d){ if(u<0||d<0||u<d) return 0; return 1ll*fac[u]*inv[d]%mod*inv[u-d]%mod; } void init(int l,int r,int up,int down){ if(l>r) return g[up][down]++,void(); int mid=(l+r)/2;f[up][down]++; //cout<<up<<' '<<down<<endl; init(l,mid-1,up+1,down); init(mid+1,r,up,down+1); } int main(){ //freopen("binary.in","r",stdin); //freopen("binary.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m;init(1,n,0,0); fac[0]=1;for(int i=1;i<=max(30,n);i++) fac[i]=1ll*fac[i-1]*i%mod; inv[n]=qp(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod; for(int i=1;i<=n;i++) pre[i]=(pre[i-1]+i)%mod;for(int i=n;i>=1;i--) suf[i]=(suf[i+1]+i)%mod; for(int a=0;a<=20;a++){ for(int b=0;b<=20;b++){ if(a+b+1<=n) f[a][b]=1ll*fac[a]*fac[b]%mod*fac[n-1-a-b]%mod*f[a][b]%mod; if(a+b<=n) g[a][b]=1ll*fac[a]*fac[b]%mod*fac[n-a-b]%mod*g[a][b]%mod; } } for(int i=1;i<=m;i++){ int x;cin>>x;int ans=0; int lo=x-1,hi=n-x; for(int j=0;j<=20;j++){ binom[0][0][j]=C(hi,j); binom[0][1][j]=C(hi-1,j-1); binom[1][0][j]=C(lo,j); binom[1][1][j]=C(lo-1,j-1); } for(int a=0;a<=20;a++){ for(int b=0;b<=20;b++){ int valf=f[a][b]; Add(ans,1ll*valf*x%mod*binom[0][0][a]%mod*binom[1][0][b]%mod); Add(ans,1ll*valf*pre[x-1]%mod*binom[0][0][a]%mod*binom[1][1][b]%mod); Add(ans,1ll*valf*suf[x+1]%mod*binom[0][1][a]%mod*binom[1][0][b]%mod); int valg=g[a][b]; Add(ans,1ll*valg*pre[x-1]%mod*binom[0][0][a]%mod*binom[1][1][b]%mod); Add(ans,1ll*valg*suf[x+1]%mod*binom[0][1][a]%mod*binom[1][0][b]%mod); } }cout<<ans<<'\n'; }cout.flush(); return 0; }


测评信息: