请示有c++来解决下题小水獭正在学习「离散数学 3」,它接触到了组合数的定义,对于非负整数 nn 和 mm 有: (nm)=n!m!(n−m)! (mn)=m!(n−m)!n! 其中 n!=1×2×⋯×nn!=1×2×⋯×n,特别地,0!=10!=1。 由组合意义可得,当 n≥mn≥m 时组合数是一个正整数。 小水獭希望你帮他编写一个程序用以计算组合数,特别地,如果组合数的值大于 109109,你只需要输出 −1−1。 输入格式 第一行一个正整数 tt(1≤t≤1051≤t≤105),表示数据组数。 对于每组数据,一行两个非负整数 n,mn,m(0≤m≤n≤1090≤m≤n≤109),表示需要计算的组合数的两个参数。 输出格式 对于每组数据,输出一行一个整数: 如果 (nm)≤109(mn)≤109,输出 (nm)(mn)。 否则,输出 −1−1。 样例 输入数据 1 2 4 2 100 50 输出数据 1 6 -1
时间: 2024-02-16 21:22:38 浏览: 109
离散数学(英文)期末复习笔记
5星 · 资源好评率100%
以下是一个使用C++编写的解决方案:
```cpp
#include <iostream>
using namespace std;
// 计算阶乘
long long factorial(int n) {
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 计算组合数
long long combination(int n, int m) {
if (n < m) {
return -1;
}
long long numerator = factorial(n);
long long denominator = factorial(m) * factorial(n - m);
if (numerator / denominator > 1000000000) {
return -1;
}
return numerator / denominator;
}
int main() {
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
long long result = combination(n, m);
cout << result << endl;
}
return 0;
}
```
这个程序首先定义了一个计算阶乘的函数 `factorial`,然后定义了一个计算组合数的函数 `combination`。在 `combination` 函数中,首先判断如果 n 小于 m,则返回 -1,表示无法计算组合数。然后计算分子和分母的阶乘,并判断结果是否超过 109。如果超过,返回 -1,否则返回计算结果。
在 `main` 函数中,首先读取输入的数据组数 t。然后使用循环读取每组数据的 n 和 m,并调用 `combination` 函数计算结果,并输出到标准输出。
希望以上解决方案对你有帮助!
阅读全文