https://www.nowcoder.com/acm/contest/113/A
题目描述
给出四堆石子,石子数分别为a,b,c,d。
规定每次只能从堆顶取走石子,问取走所有石子的方案数。
输入描述:
在一行内读入四个由空格分隔的整数a,b,c,d,
输入均为不超过500的正整数
输出描述:
输出一个整数表示答案,答案对109+7取模
示例1
输入
3 5 4 2
输出
2522520
备注:
输入均为不超过500的正整数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
const int maxn = 1000010;
ll qpow(ll a,ll x){
ll ret=1;
while (x){
if (x&1)
ret = ret*a%mod;
a=a*a%mod;
x>>=1;
}
return ret;
}
ll fac[maxn],inv[maxn];
ll init(){
fac[0]=1;
for (int i=1;i<maxn;i++)
fac[i]=fac[i-1]*i%mod;
inv[maxn-1]=qpow(fac[maxn-1],mod-2);
for (int i=maxn-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
return 0;
}
ll c(ll n,ll m){
if (n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
init();
int p,q,r,s,sum=0;
cin>>p>>q>>r>>s;
ll ans=1;
sum=p+q+r+s;
ans=ans*c(sum,p)%mod,sum-=p;
ans=ans*c(sum,q)%mod,sum-=q;
ans=ans*c(sum,r)%mod,sum-=r;
cout<<ans<<endl;
return 0;
}