安全系统

题目链接:https://www.luogu.com.cn/problem/P2638

题意:

n个存储区,每个存储区可以放任意个0或1。0最多有a个,1最多有b个,求方案数

思路:

发现这是每组允许为空的隔板法
即对于一个数字,如果放k个,要求分成n组,(k<n),那么需要先借来n个,分完组后还回去
简而言之其方案数为: C_{n+k-1}^{n-1}
0和1是独立的,根据乘法原理只需要枚举个数相乘即可

__int128

长度约为39位>2x18
这种类型的变量可以做基本的运算,%之类的也能做,不过不能用标准输入输出(cin,cout之类)
在输出时,需要将其转化为字符串

lll ans;
lll c[300][300];
void solve(){
	int n,a,b;cin>>n>>a>>b;
	for(int i=0;i<=n+a+b;i++){
		for(int j=0;j<=i;j++){
			if(j==0||j==i)c[i][j]=1;
			else{
				c[i][j]=c[i-1][j]+c[i-1][j-1];
			}
		}
	}
	for(int i=0;i<=a;i++)//0
	{
		for(int j=0;j<=b;j++)//1
		{
			ans+=c[i-1+n][n-1]*c[j-1+n][n-1];
		}
	}
	
	string output="";
	while(ans){
		output.pb(ans%10+'0');
		ans/=10;
	}
	reverse(output.begin(),output.end());
	cout<<output<<endl;
}
posted @ 2025-04-09 15:10  Marinaco  阅读(13)  评论(0)    收藏  举报
//雪花飘落效果