题解 P1358 【扑克牌】
题目链接
很明显,对于喜欢打扑克牌的有数学细胞的人,从
求组合数有两种方法,一是用排列做分数,二是递归,三是递推,也就是杨辉三角
也就是对应
略微排版不整齐,请管理员和读者包容一下。
在
a[0][0]=1;
for(int i=1;i<=10000;i++)
for(int j=0;j<=100;j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j])%10007;//杨辉三角等于左上角的数值+右上角的数值
每个人分别计算一下就好了,记得%
#include<bits/stdc++.h>
using namespace std;
long long n,m,s=1,t;
long long a[10005][105];
int main()
{
cin>>n>>m;
a[0][0]=1;
for(int i=1;i<=10000;i++)
for(int j=0;j<=100;j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j])%10007;
for(int i=1;i<=m;i++){
cin>>t;
s=s*a[n][t]%10007;
n-=t;//牌已经被抽走了,要减掉
}
cout<<s;
return 0;
}