题解 P1358 【扑克牌】
guobaipeng0 · · 题解
C++简短题解,蒟蒻看不懂楼下高深算法,由此我想到了用二维数组杨辉三角求组合数,a[i][j]=a[i-1][j-1]+a[i-1][j]这样就不会像楼下所说枚举超时。要注意求杨辉三角时取模10007,以及求方案数时取模10007,接着扑克牌数量要减去第i个人拿的牌。
注:其实数据很大,10000*10000的数组根本装不下,所以有点坑数据的成分,因为猜测m<=100,所以二维数组后面改成10000*100
#include<bits/stdc++.h>
using namespace std;
long long n,m,i,j,s=1,t,a[10005][105];
int main()
{
cin>>n>>m;
a[0][0]=1;
for (i=1; i<=10000; i++)
for (j=0; j<=100; j++)
a[i][j]=(a[i-1][j-1]+a[i-1][j])%10007; //杨辉三角求组合数
for (i=1; i<=m; i++)
{
cin>>t;
s=s*a[n][t]%10007; //记得取模
n-=t; //由于第i个人拿了t张,扑克牌数量减少t
}
cout<<s;
return 0;
}