題目描述
輸入描述:
在一行內讀入四個由空格分隔的整數a,b,c,d, 輸入均爲不超過500的正整數
輸出描述:
輸出一個整數表示答案,答案對109+7取模
輸入
3 5 4 2
輸出
2522520
備註:
輸入均爲不超過500的正整數
分析:
從結果分析,可以看成是從中任意去a個到第一堆中,然後在剩下的裏取b個到第二堆中,接着從剩下的任意取c個到第三堆中,最後剩下的d個放到第四堆中,故結果爲C(a, a+b+c+d)*C(b, b+c+d)*C(c, c+d) = (a+b+c+d)!/(a!b!c!d!)%mod。使用逆元取模即可,代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000000+7;
const int maxn = 2005;
ll p[maxn] = {0};
int a, b, c, d;
int ans;
long long quickpow(long long a, long long b) {
if (b < 0) return 0;
long long ret = 1;
a %= mod;
while(b) {
if (b & 1) ret = (ret * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ret;
}
long long inv(long long a) {
return quickpow(a, mod - 2);
}
int main(){
p[1] = 1;
for(int i=2; i<=2000; i++){
p[i] = i*p[i-1]%mod;
}
cin>>a>>b>>c>>d;
int ans = p[a]*p[b]%mod*p[c]%mod*p[d]%mod;
cout<<p[a+b+c+d]*inv(ans)%mod<<endl;
}