计算多项式指定系数

注意:代码由人类编写,文章由AI(deepseek-r1:617B)书写

博客食用更佳
题目解析:

我们需要展开多项式 (by + ax)^k,并找到其中 x^n y^m 项的系数。根据二项式定理,展开式中的每一项形式为 \binom{k}{i} (ax)^i (by)^{k-i}。当 i = nk - i = m 时,即 n + m = k,此时对应的项即为所求。因此,该系数为:

\binom{k}{n} \cdot a^n \cdot b^m

解题步骤:

  1. 预处理组合数: 使用动态规划预计算组合数 \binom{k}{n} \mod 10007
  2. 快速幂计算: 分别计算 a^n \mod 10007b^m \mod 10007
  3. 结果相乘取模: 将组合数与两个幂的结果相乘,并对结果取模。

代码实现:

#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;
}

代码详解:

  1. 预处理组合数: 使用二维数组 C 存储组合数 \binom{i}{j}。通过递推公式 \binom{i}{j} = \binom{i-1}{j} + \binom{i-1}{j-1} 计算,并取模 10007。
  2. 快速幂函数 qpow 高效计算大数幂取模,避免直接计算大数导致溢出。
  3. 主函数: 读取输入后,计算组合数,再利用快速幂得到 a^nb^m 的模值,最后相乘取模得到结果。

注意事项:

  • 由于 ab 可能很大,计算幂前先对它们取模,避免中间结果溢出。
  • 组合数预处理的范围需覆盖题目给出的最大 k 值(1000)。

此方法高效且正确,能够处理题目范围内的所有情况。