计算多项式指定系数
注意:代码由人类编写,文章由AI(deepseek-r1:617B)书写
博客食用更佳
题目解析:
我们需要展开多项式 (by + ax)^k,并找到其中 x^n y^m 项的系数。根据二项式定理,展开式中的每一项形式为 \binom{k}{i} (ax)^i (by)^{k-i}。当 i = n 且 k - i = m 时,即 n + m = k,此时对应的项即为所求。因此,该系数为:
\binom{k}{n} \cdot a^n \cdot b^m
解题步骤:
- 预处理组合数: 使用动态规划预计算组合数 \binom{k}{n} \mod 10007。
- 快速幂计算: 分别计算 a^n \mod 10007 和 b^m \mod 10007。
- 结果相乘取模: 将组合数与两个幂的结果相乘,并对结果取模。
代码实现:
#include <iostream>
using namespace std;
const int maxk = 1000, P = 10007;
int C[maxk + 5][maxk + 5]; // 组合数数组
// 快速幂函数,计算 (base^e) % P
int qpow(int base, int e) {
int res = 1;
while (e > 0) {
if (e & 1) res = res * base % P;
base = base * base % P;
e >>= 1;
}
return res;
}
int main() {
int a, b, k, n, m;
cin >> a >> b >> k >> n >> m;
// 预处理组合数 C[i][j]
for (int i = 0; i <= maxk; ++i) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
}
// 计算三个部分的模值并相乘
int comb = C[k][m];
int a_pow = qpow(a % P, n);
int b_pow = qpow(b % P, m);
cout << comb * a_pow % P * b_pow % P << endl;
return 0;
}
代码详解:
- 预处理组合数: 使用二维数组
C
存储组合数 \binom{i}{j}。通过递推公式 \binom{i}{j} = \binom{i-1}{j} + \binom{i-1}{j-1} 计算,并取模 10007。 - 快速幂函数
qpow
: 高效计算大数幂取模,避免直接计算大数导致溢出。 - 主函数: 读取输入后,计算组合数,再利用快速幂得到 a^n 和 b^m 的模值,最后相乘取模得到结果。
注意事项:
- 由于 a 和 b 可能很大,计算幂前先对它们取模,避免中间结果溢出。
- 组合数预处理的范围需覆盖题目给出的最大 k 值(1000)。
此方法高效且正确,能够处理题目范围内的所有情况。