1 条题解

  • 0
    @ 2026-4-5 20:14:05

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    const int MOD=1e9+7;
    const int N=1005;
    int T,n,m,ls,a[N],c[N][N],ans,sum;
    void init(){	// 初始化组合
    	for(int i=0;i<N;i++)
    		for(int j=0;j<=i;j++)
    			if(j==0)c[i][j]=1;
    			else c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;	// 记得取模
    }
    int main(){
    	init();
    	cin>>T;
    	while(T--){
    		cin>>n>>m;
    		sum=0;	// sum 记录奖品总数
    		for(int i=1;i<=m;i++)cin>>a[i],sum+=a[i];	// 输入的同时更新 sum
    		ans=1;
    		// ls=n+(sum>n) 表示如果 sum>n,那么 ls=n+1,否则 ls=n,即解决上面所说的问题
    		for(int j=1,ls=n+(sum>n);j<=m;j++){	// 每一种奖品
    			ans=(1ll*ans*c[ls][a[j]])%MOD;	// 注意转化为 long long 类型后再取模,否则有可能爆 int
    			ls-=a[j];	// 将还未领奖品的人数,即空的位置数减一
    		}
    		cout<<ans%MOD<<"\n";
    	}
    	return 0;
    }
    
    

    信息

    ID
    745
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者