安全系统
题目链接: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;
}

浙公网安备 33010602011771号