解析:
设dp[i]为考虑前i个任务的方案数,s[i]为前i 个任务的总时间。
则dp[0] = 1,s[0] = a[0]。
状态转移方程: dp[i] = dp[i-1]*C(s[i-1]+a[i]-1,a[i]-1)。
[code]:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;
const int M = 1e6+6;
int n,a[1005];
LL mul[M],dp[1005],s[1005];
LL mod_pow(LL a,LL b){
LL res = 1;
while(b){
if(b&1) res = (res*a)%MOD;
a = (a*a)%MOD;
b >>= 1;
}
return res;
}
LL Comb(LL n,LL m){
if(n < m) return 0;
if(m==0||m==n) return 1;
LL res = (mul[n]*mod_pow(mul[m]*mul[n-m]%MOD,MOD-2))%MOD;
return res;
}
int main(){
int i,j,cas,T;
scanf("%d",&cas);
mul[0] = 1;
for(i = 1;i < M;i++) mul[i] = mul[i-1]*i%MOD;
for(T = 1;T <= cas;T++){
scanf("%d",&n);
for(i = 0;i < n;i++) scanf("%d",&a[i]);
printf("Case %d: ",T);
dp[0] = 1;s[0] = a[0];
for(i = 1;i < n;i++){
dp[i] = (dp[i-1]*Comb(s[i-1]+a[i]-1,a[i]-1))%MOD;
s[i] = s[i-1]+a[i];
}
printf("%lld\n",dp[n-1]);
}
return 0;
}