我这份求组合数的代码全都输出0是怎么回事?输入为3 2 4 2 5 2 10 5 1000 500 1000 1000 1000 10000 10000 1000 10000 5000 40000 20000#include <iostream> #include <cstring> using namespace std; typedef __int128 ll; const int N = 1e5 + 10; const ll mod = 1000000000000000007; int fact[N], infact[N]; int qmi(int a, ll b, ll p) { int res = 1; while (b) { if (b & 1) res = res * a % p; a = a * a % p; b >>= 1; } return res; } ll read() { ll x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } void write(ll x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) write(x / 10); putchar(x % 10 + '0'); } int main() { fact[0] = infact[0] = 1; for (int i = 1; i < N; ++ i ) { fact[i] = (ll)fact[i - 1] * i % mod; infact[i] = (ll)infact[i - 1] * qmi(i, mod - 2, mod) % mod; } int T = 10; while ( T -- ) { int a = read(), b = read(); if (a < b) { puts("0"); continue; } ll res = (ll)fact[a] * infact[b] % mod * infact[a - b] % mod; write(res); puts(""); } return 0; }
时间: 2024-03-31 20:38:52 浏览: 75
你的代码中使用了 __int128 类型,这是一个可以存储非常大的整数的数据类型,但是一般的编译器都不支持这个类型。因此,你需要使用一些特殊的编译器或者库来编译这个程序。如果你使用的是普通的编译器,那么代码中的 __int128 类型会被当做未定义的类型,从而导致编译错误。如果你使用了特殊的编译器或者库来编译这个程序,那么可能是你的输入数据有误,导致程序输出了0。建议你检查一下输入数据是否正确。
相关问题
用动态规划算法求组合数C r n 。 例如,输入:5 3 则输出:10C语言代码
使用动态规划求解组合数C
r
n
的代码如下:
```c
#include <stdio.h>
int C(int n, int r) {
int dp[101][101] = {0}; // 初始化为0
for (int i = 0; i <= n; i++) {
dp[i] = 1; // C(i, 0) = 1
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= r; j++) {
dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
}
}
return dp[n][r];
}
int main() {
int n, r;
scanf("%d%d", &n, &r);
printf("%d", C(n, r));
return 0;
}
```
其中,dp[i][j]表示从i个物品中选j个的方案数。根据组合数的性质,C(i, j) = C(i-1, j) + C(i-1, j-1),因此可以使用递推的方式求解。在代码中,首先初始化边界条件dp[i] = 1,然后按照递推式dp[i][j] = dp[i-1][j] + dp[i-1][j-1]更新状态,最终返回dp[n][r]即为所求的组合数。
用动态规划算法求组合数C r n 。 例如,输入:5 3 则输出:10 c语言完整代码
动态规划算法可以用来求解组合数问题,其中C
r
n
表示从n个元素中选出r个元素的组合数。
动态规划的思路是:将问题分解成若干个子问题,通过子问题的解来求出原问题的解。对于组合数问题,可以使用递推公式:
C(r,n) = C(r-1,n-1) + C(r,n-1)
其中C(0,0) = 1, C(r,0) = 0 (r>0), C(r,n) = 0 (r>n)。
以下是C语言完整代码:
```
#include <stdio.h>
int main() {
int n, r;
scanf("%d %d", &n, &r);
int c[r+1][n+1];
// 初始化边界值
for (int i = 0; i <= r; i++) {
c[i] = 0;
}
for (int j = 0; j <= n; j++) {
c[j] = 1;
}
// 递推求解
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= n; j++) {
if (i > j) {
c[i][j] = 0;
} else {
c[i][j] = c[i-1][j-1] + c[i][j-1];
}
}
}
printf("%d", c[r][n]);
return 0;
}
```
阅读全文