用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。
时间: 2023-11-15 16:45:48 浏览: 98
当计算组合数时,可以使用动态规划的方法来避免重复计算。下面是一个用 C++ 编写的程序示例:
```cpp
#include <iostream>
using namespace std;
long long combination(int n, int m) {
if (n < m)
return -1;
long long dp[n+1][m+1];
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= min(i, m); j++) {
if (j == 0 || j == i)
dp[i][j] = 1;
else
dp[i][j] = (dp[i-1][j-1] + dp[i-1][j]) % 1000000007; // 取模防止溢出
}
}
return dp[n][m];
}
int main() {
int n, m;
cout << "请输入非负整数 n 和 m:" << endl;
cin >> n >> m;
long long result = combination(n, m);
if (result > 1000000000)
cout << -1 << endl;
else
cout << result << endl;
return 0;
}
```
这个程序使用了动态规划的思想,通过填充一个二维数组来计算组合数。其中 `dp[i][j]` 表示从 i 个元素中选择 j 个元素的组合数。程序首先检查输入的有效性,确保 n 大于等于 m。然后使用两层循环来填充 dp 数组,最后返回 dp[n][m] 的值。如果计算得到的组合数大于 109109,就输出 -1。否则,输出计算得到的组合数。
注意:在计算过程中使用取模操作 `(dp[i-1][j-1] + dp[i-1][j]) % 1000000007` 是为了防止计算结果溢出。你可以根据需要调整取模的值。
阅读全文