酷代码 AI
菜单
服务商

C++实现分配小球问题:计算n*m个小球平均分给n个同学的方法数

以下是解决该问题的C++代码: ```cpp #include <iostream> using namespace std; const int MOD = 1e9 + 7; // 计算阶乘 long long factorial(long long num) { long long result = 1; for (long long i = 1; i <= num; i++) { result = (result * i) % MOD; } return result; } // 计算组合数 C(n, k) long long combination(long long n, long long k) { long long numerator = factorial(n); long long denominator = (factorial(k) * factorial(n - k)) % MOD; // 使用费马小定理求逆元 long long inv_denominator = 1; long long power = MOD - 2; long long base = denominator; while (power > 0) { if (power % 2 == 1) { inv_denominator = (inv_denominator * base) % MOD; } base = (base * base) % MOD; power /= 2; } return (numerator * inv_denominator) % MOD; } int main() { int n, m; cin >> n >> m; long long ans = 1; long long total = n * m; for (int i = 0; i < n; i++) { ans = (ans * combination(total, m)) % MOD; total -= m; } cout << ans << endl; return 0; } ``` ### 代码解释: 1. **`factorial` 函数**:用于计算一个数的阶乘,并对结果进行取模操作,避免溢出。 2. **`combination` 函数**:用于计算组合数 $C(n, k)$。通过计算分子和分母的阶乘,然后使用费马小定理求分母的逆元,最后得到组合数的结果。 3. **`main` 函数**:读取输入的 $n$ 和 $m$,然后使用循环计算分配小球的方法数。每次从剩余的小球中选择 $m$ 个分给一个同学,直到所有同学都分配完毕。最后输出结果。 ######[AI问答 | 554点数解答 | 2026-05-31 15:26:03]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]