扑克牌(递推)

扑克牌(递推)_第1张图片

 传送门

该题框架很容易写出来,循环对每一个计算发个他Ai张牌有多少种组合数,然后牌数减去发出的牌数即可,难点主要在于计算组合数

这里我们考虑使用杨辉三角来求组合数

即利用a[i][j]=a[i-1][j-1]+a[i-1][j]

#include

#define int long long
using namespace std;
const int MAX1=10005,MAX2=105,mod=10007;
int n,m;
int arr[MAX1][MAX2];//定义组合数arr[i][j]为i个里面取j个 

signed main(){
	cin>>n>>m;
	int nn=n;
	int ans=1;
	arr[0][0]=1;//注意这里选择下标从0开始才能契合同时还能得到组合数取0个等于1的情况
	for(int i=1;i<=10000;i++){
		for(int j=0;j<=100;j++){
			arr[i][j]=(arr[i-1][j-1]+arr[i-1][j])%mod;
		}
	} 
	
	for(int i=1;i<=m;i++){
		int a;
		cin>>a;
		int temp=arr[nn][a];//得到每个人发a张牌的组合数
		ans=(ans*temp)%mod;//注意取模
		nn-=a;
	}
	cout<

你可能感兴趣的:((算法+例题)讲解,算法)