标签:esc play 超过 names cst 描述 div clu ext
题目描述
在一行内读入四个由空格分隔的整数a,b,c,d, 输入均为不超过500的正整数>
输出一个整数表示答案,答案对109+7取模
3 5 4 2
2522520
输入均为不超过500的正整数
题意:每次只能取一颗石子,然后有多少种不同的取石子方法,其中有一个顺序不同即视为不同顺序‘
思路:当时以为可以取多个被坑了,然后一直以为是一个博弈,后来才看懂题,把四堆石子分为四个队伍,然后问所有队员排列有多少种方法,但是因为队伍内的人员有重复,所以要进行去重
(a+b+c+d)!代表所有的数的全排列
(a+b+c+d)/(a!*b!*c!*d!)(去重公式)
(a+b+c+d)!代表所有的数的全排列
由于第一队有a个元素,所以a个元素的全排是重复的。
b,c,d同上。
得出最后的结果
(a+b+c+d)/(a!*b!*c!*d!)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; typedef long long ll; const ll N=2010,mo=1e9+7; ll power(ll a,ll b){//快速幂 ll ans=1; while (b){ if (b&1)ans=ans*a%mo; a=a*a%mo; b>>=1; }return ans; } ll jc(ll a){ ll ans=1; for (ll i=1;i<=a;i++)ans=ans*i%mo; return ans; } ll ny(ll x){//逆元 return power(x,mo-2); } ll a,b,c,d; int main(){ cin>>a>>b>>c>>d; ll ans=jc(a+b+c+d); ans=ans*ny(jc(a))%mo*ny(jc(b))%mo*ny(jc(c))%mo*ny(jc(d))%mo; cout<<ans<<endl; }
标签:esc play 超过 names cst 描述 div clu ext
原文地址:https://www.cnblogs.com/Lis-/p/9094080.html