安全系统
题目描述
特斯拉公司的六位密码被轻松破解后,引发了人们对电动车的安全性能的怀疑。李华听闻后,自己设计了一套密码:
- 假设安全系统中有 n n n 个储存区,每个储存区最多能存储存 2 2 2 种种类不同的信号(可以不储存任何信号)。有 0 0 0 和 1 1 1 这两种信号,其中 0 0 0 有 a a a 个, 1 1 1 有 b b b 个,单独一个 0 0 0 或 1 1 1 算一个信号。现要将这些信号储存在储存区中, 0 0 0 和 1 1 1 可以不用全部储存,一个储存区可以存放任意多个 0 0 0 和任意多个 1 1 1。一种不同的储存方案经过李华处理后就将是一串不同的密码。
现在给出 n , a , b n,a,b n,a,b,求可能的不同储存方案的个数。
输入格式
第一行:共 3 3 3 个整数, n , a , b n,a,b n,a,b。
输出格式
第一行:一个整数,表示方案个数。
样例 #1
样例输入 #1
2 1 1
样例输出 #1
9
提示
所有 9 9 9 种方案如下:
储存区 1 1 1 | 储存区 2 2 2 |
---|---|
NULL \verb!NULL! NULL | NULL \verb!NULL! NULL |
0 0 0 | NULL \verb!NULL! NULL |
1 1 1 | NULL \verb!NULL! NULL |
NULL \verb!NULL! NULL | 0 0 0 |
NULL \verb!NULL! NULL | 1 1 1 |
0 , 1 0,1 0,1 | NULL \verb!NULL! NULL |
NULL \verb!NULL! NULL | 0 , 1 0,1 0,1 |
1 1 1 | 0 0 0 |
0 0 0 | 1 1 1 |
对于全部数据, a , b ≤ 50 a,b\le 50 a,b≤50, n + a ≤ 50 n+a\le 50 n+a≤50, n + b ≤ 50 n+b\le 50 n+b≤50。
upd 2022.10.22 \text{upd 2022.10.22} upd 2022.10.22:新增加一组 Hack 数据。
###### 解题心得:这道题我也想到了用组合数无奈实力有限不知道这么处理,跑去看了题解~~
题目分析:
然后就是痛苦的高中组合数了,每次做这种题都很折磨!!! 本题用到了隔板法
注意:然后我们可以先用杨辉三角来算组合数,再来看一下数据范围。这里的组合数需要算到多大呢?容易看出最大总元素数(就是 C 的那个下标)是 n+max(a,b) - 1,因此需要用 unsigned long long来存数。
代码部分:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N = 110;ULL c[N][N];
int n,a,b;
ULL ans;void Init()
{c[1][0] = 1,c[1][1] = 1;for(int i = 2; i < N; i++){c[i][0] = 1;for(int j = 1; j <= i; j++)c[i][j] = c[i - 1][j - 1] + c[i - 1][j];}
}int read()
{int s=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}return s*f;
}int main() {n = read(),a = read(),b = read();Init();for(int i = 0; i <= a; i++)for(int j = 0; j <= b; j++){ans += c[n + i - 1][n - 1] * c[n + j - 1][n - 1];}cout<<ans;return 0;
}