链接:https://www.nowcoder.com/acm/contest/113/A
来源:牛客网
取石子
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描给出四堆石子,石子数分别为a,b,c,d。规定每次只能从堆顶取走石子,问取走所有石子的方案数。
输入描述:
在一行内读入四个由空格分隔的整数a,b,c,d, 输入均为不超过500的正整数
输出描述:
输出一个整数表示答案,答案对10^9+7
示例1
输入
3 5 4 2
输出
2522520
备注:
输入均为不超过500的正整数
题目分析:每堆石子内部的顺序已经确定,只有堆之间的顺序不确定,如果正面思考如何排序很难入手,反正最后都是要取出来放到一条线上,所以不如直接看作是在一个线上取相应多少的石子到相应的堆中,种类数也就是C(a+b+c+d,a) *C(b+c+d,b) * C(c+d,c)=(a+b+c+d)!/(a!b!c!d!)。利用逆元进行取模即可
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const long long mod=1e9+7; 5 long long qaq(long long x) 6 { 7 long long ans=1; 8 for(long long i = 1 ; i <= x ; i++) 9 { 10 ans=(ans*i)%mod; 11 } 12 return ans; 13 } 14 long long mypow(long long x,long long y) 15 { 16 long long ans=1; 17 while(y) 18 { 19 //cout <<x << endl; 20 if(y&1)ans=(ans*x)%mod; 21 x=((x%mod)*(x%mod))%mod; 22 y/=2; 23 24 } 25 return ans; 26 } 27 int main() 28 { 29 long long a,b,c,d; 30 scanf("%lld%lld%lld%lld",&a,&b,&c,&d); 31 long long qwq=qaq(a+b+c+d)%mod; 32 long long orz1=qaq(a)%mod; 33 long long orz2=qaq(b)%mod; 34 long long orz3=qaq(c)%mod; 35 long long orz4=qaq(d)%mod; 36 long long orz5=(((((orz1*orz2)%mod)*orz3)%mod)*orz4)%mod; 37 long long endd=qwq*mypow(orz5,mod-2)%mod; 38 cout << endd<<endl; 39 return 0; 40 }