Devu and Flowers

  • 多重集的组合数问题。注意C(0,0)应该是1
  • __builtin_ffs和__builtin_ctz的功能是类似的
#include <bits/stdc++.h>
using namespace std;
#define int long long
const signed mod=1000000007;
int power(int n,int p)
{
	if(p==0)
	{
		return 1;
	}
	long long tmp=power(n,p/2);
	if(p%2==1)
	{
		return tmp*tmp%mod*n%mod;
	}
	return tmp*tmp%mod;
}
int f[25],sum[1<<20],inv[25];
int lowbit(int n)
{
	return n&(-n);
}
int c(int n,int m)
{
	if(n<0||m<0)
	{
		return 0;
	}
	if(m>n)
	{
		return 0;
	}
	if(n==0&&m==0)
	{
	    return 1;
	}
	n%=mod;
	int res=inv[m];
	while(m--)
	{
		res=res*n%mod;
		n--;
	}
	return res;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,s;
	cin>>n>>s;
	inv[0]=1;
	for(int i=1;i<=n;i++)
	{
		inv[i]=inv[i-1]*power(i,1000000005)%mod;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>f[i];
	}
	int ans=0;
	for(int i=0;i<(1<<n);i++)
	{
		if(i>0)
		{
			sum[i]=sum[i-lowbit(i)]+f[__builtin_ffs(i)]+1;
		}
		int opt=__builtin_parity(i);
		opt==0? opt=1:opt=-1;
		ans=(ans+opt*c(n+s-1-sum[i],n-1))%mod;
	}
	cout<<(ans+mod)%mod<<endl;
	return 0;
}
posted @ 2025-03-12 14:57  D06  阅读(38)  评论(0)    收藏  举报
//雪花飘落效果