如何用c语言求 C(m,n)*1/2^n 对998244353取模
时间: 2023-04-09 18:02:46 浏览: 242
c(m,n)算法
可以使用快速幂算法和逆元求解。具体步骤如下:
1. 预处理阶乘和逆元,可以使用递推公式计算。
2. 计算 C(m,n) 的值,可以使用组合数公式计算。
3. 计算 1/2^n 的值,可以使用快速幂算法计算。
4. 计算 C(m,n)*1/2^n 的值,可以直接相乘。
5. 对结果取模,可以使用取模运算符 %。
下面是示例代码:
```c
#include <stdio.h>
const int MOD = 998244353;
const int MAXN = 1000000;
int fact[MAXN+1];
int inv[MAXN+1];
int pow_mod(int a, int b, int mod) {
int res = 1;
while (b) {
if (b & 1) res = (long long)res * a % mod;
a = (long long)a * a % mod;
b >>= 1;
}
return res;
}
void init() {
fact[0] = 1;
for (int i = 1; i <= MAXN; i++) {
fact[i] = (long long)fact[i-1] * i % MOD;
}
inv[MAXN] = pow_mod(fact[MAXN], MOD-2, MOD);
for (int i = MAXN-1; i >= 0; i--) {
inv[i] = (long long)inv[i+1] * (i+1) % MOD;
}
}
int C(int m, int n) {
if (m < n) return 0;
return (long long)fact[m] * inv[n] % MOD * inv[m-n] % MOD;
}
int main() {
init();
int m = 10, n = 5;
int ans = (long long)C(m, n) * pow_mod(2, MOD-2*n, MOD) % MOD;
printf("%d\n", ans);
return 0;
}
```
阅读全文