Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
168746 | C班-范浩宇 | 组合数的高精度算法 | C++ | 运行出错 | 0 | 16 MS | 264 KB | 1193 | 2024-08-20 13:35:08 |
#include <bits/stdc++.h> using namespace std; void jc(int n, int arr[]) { arr[0] = 1; arr[1] = 1; for (int i = 2; i <= n; ++i) { int carry = 0; for (int j = 1; j <= arr[0]; ++j) { int p = arr[j] * i + carry; arr[j] = p % 10; carry = p / 10; } while (carry) { arr[++arr[0]] = carry % 10; carry /= 10; } } } void di(int num[], int div, int tmp[]) { int r = 0; for (int i = num[0]; i > 0; --i) { int curr = r * 10 + num[i]; tmp[i] = curr / div; r = curr % div; } tmp[0] = num[0]; while (tmp[0] > 1 && tmp[tmp[0]] == 0) { tmp[0]--; } } int C(int m, int n) { int jcMPlusN[1045] = {0}; int jcM[1045] = {0}; int jcN[1045] = {0}; jc(m + n, jcMPlusN); jc(m, jcM); jc(n, jcN); int tmp[1045] = {0}; di(jcMPlusN, jcM[1] * jcN[1], tmp); int res = 0; for (int i = tmp[0]; i >= 1; --i) res = res * 10 + tmp[i]; return res; } int main() { int m, n; cin >> m >> n; cout << C(m-1, n-1) << endl; return 0; }