Acwing214 Devu和鲜花(组合数学&容斥原理)

发布于 2021-11-24  871 次阅读


题目链接:https://www.acwing.com/problem/content/216/

只是我的一道容斥原理的入门题,不多说,具体参照算法竞赛进阶指南176页

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD=1e9+7;
ll a[50],inv[50];
ll power(ll a,ll b){
	ll c=1;
	for(;b;b>>=1){
		if(b&1) c=c*a%MOD;
		a=a*a;a%=MOD;
	}
	return c;
}
ll C(ll n,ll m){
	if(m<0||n<0||m<n) return 0;
	m%=MOD;
	if(m==0||n==0) return 1;
	ll ans=1;
	for(int i=0;i<n;i++) ans=ans*(m-i)%MOD;
	for(int i=1;i<=n;i++){
		ans=ans*inv[i]%MOD;
	}
	return ans;
}
int main(){
	for(int i=1;i<=20;i++) inv[i]=power(i,MOD-2);
	ll n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	ll ans=0;
	for(int x=0;x<(1<<n);x++){
		if(x==0){
			ans=C(n-1,n+m-1);
			continue;
		}
		ll t=n+m;
		int p=0;
		for(int i=0;i<n;i++){
			if((x>>i)&1){
				p++;
				t-=a[i+1];
			}
		}
		t-=p+1;
		if(p&1){
			ans=(ans-C(n-1,t)+MOD)%MOD;
		}
		else ans=(ans+C(n-1,t))%MOD;
	}
	cout<<ans;
	return 0;
}

回忆这理想不够理想,沿途逛世间一趟只有向上