有题解了 仅供参考
2025-05-04 10:06:19
发布于:广东
13阅读
0回复
0点赞
OK啊,花了七七四十九小时我们很 轻松 的就知道这道题其实是分步算0和1的放法,每个存储区可放任意数量0或1,但最多两种类型。把a个0分到n个区的方案数是组合数C(n+a, a),同理b个1是C(n+b, b),两数相乘就是总方案,不想说太多直接看代码
#include <iostream>
using namespace std;
long long com(int n, int k) {
if (k > n) return 0;
if (k == 0 || k == n) return 1;
k = min(k, n - k);
long long res = 1;
for (int i = 1; i <= k; ++i) {
res *= (n - k + i);
res /= i;
}
return res;
}
int main() {
int n,a,b;
cin>>n>>a>>b;
if (n == 0) {
cout << (a == 0 && b == 0 ? 1 : 0) << endl;
return 0;
}
long long ans = com(n + a, a) * com(n + b, b);
cout<<ans<<endl;
return 0;
}
这里空空如也
有帮助,赞一个