1 solutions
-
0
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; }
Information
- ID
- 152
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By