安全系统
题目描述
特斯拉公司的六位密码被轻松破解后,引发了人们对电动车的安全性能的怀疑。李华听闻后,自己设计了一套密码:
- 假设安全系统中有 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 数据。
问题链接: P2638 安全系统
问题分析: 数学问题。用64位无符号整数来计算,虽然得100分,对于新增加一组 Hack 数据,没有通过。用128位整数来计算可以AC。
参考链接: (略)
题记: (略)
AC的C++语言程序如下:
/* P2638 安全系统 */
#include <iostream>
#include <cstdio>
using namespace std;
typedef __int128_t U128;
template <typename T>
inline void write(T x) {
if (x < 0) {
x = ~(x - 1);
putchar('-');
}
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
// 计算二项式
U128 bino(int n, int r)
{
U128 ans = 1;
for (int i = 1; i <= r; i++)
ans *= n - i + 1, ans /= i;
return ans;
}
int main()
{
int n, a, b;
cin >> n >> a >> b;
write(bino(a + n, n) * bino(b + n, n));
return 0;
}
100分(没有AC)的C++语言程序如下:
/* P2638 安全系统 */
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
// 计算二项式
ULL bino(int n, int r)
{
ULL ans = 1;
for (int i = 1; i <= r; i++)
ans *= n - i + 1, ans /= i;
return ans;
}
int main()
{
int n, a, b;
cin >> n >> a >> b;
cout << bino(a + n, n) * bino(b + n, n);
return 0;
}