本题需要计算多项式 (by+ax)k 展开式中 x<sup>ny</sup>m 项的系数。核心要点:
采用动态规划模拟多项式展开过程:
dp[i][j] 表示 (by+ax)i−1 展开式中 yj−1 的系数dp[1][1]=1(对应零次幂常数项)dp[i][j] = (dp[i-1][j-1]*b + dp[i-1][j]*a) % moddp[k+1][m+1] 对应 x<sup>ny</sup>m 的系数cpp1#include <iostream> 2using namespace std; 3const int MOD = 10007; 4 5int main() { 6 long long a, b, k, n, m; 7 cin >> a >> b >> k >> n >> m; 8 9 // DP数组:dp[i][j]表示(by+ax)<sup>{i-1}展开式中y</sup>{j-1}项的系数 10 long long dp[1010][1010] = {0}; 11 dp[1][1] = 1; // 初始状态:0次幂的常数项为1 12 13 // 动态规划递推:i为当前多项式次数+1 14 for (int i = 2; i <= k + 1; i++) { 15 // 计算(by+ax)^{i-1}展开式的j项系数(j从1到i) 16 for (int j = 1; j <= i; j++) { 17 // 状态转移:由i-1层的j-1项乘b(增加y的幂)和j项乘a(增加x的幂) 18 long long term1 = (j - 1 >= 1) ? dp[i - 1][j - 1] * b : 0; // O(1)操作 19 long long term2 = (j <= i - 1) ? dp[i - 1][j] * a : 0; // O(1)操作 20 dp[i][j] = (term1 + term2) % MOD; // 合并结果并取模 21 } 22 } 23 24 cout << dp[k + 1][m + 1]; // 输出y<sup>m项系数(即x</sup>n*y^m项) 25 return 0; 26}
代码解释:
a, b:多项式系数k:多项式幂次n, m:目标项的指数(满足 n+m=k)dp[1][1]=1 表示零次幂常数项i 从2到k+1,对应多项式次数从1到kj 计算当前幂次各项系数term1:继承自 yj−2 项并乘 b(增加 y 指数)term2:继承自 yj−1 项并乘 a(增加 x 指数)python1MOD = 10007 2 3def main(): 4 a, b, k, n, m = map(int, input().split()) 5 6 # 初始化DP数组:dp[i][j]表示(by+ax)<sup>{i-1}中y</sup>{j-1}项系数 7 dp = [[0] * 1010 for _ in range(1010)] # O(k^2)空间 8 dp[1][1] = 1 # 0次幂的常数项 9 10 # 动态规划递推 11 for i in range(2, k + 2): # i: 2~k+1 (对应多项式次数1~k) 12 for j in range(1, i + 1): # j: 1~i (当前层项数) 13 # 状态转移(自动处理越界索引返回0) 14 term1 = dp[i - 1][j - 1] * b if j - 1 >= 1 else 0 15 term2 = dp[i - 1][j] * a if j <= i - 1 else 0 16 dp[i][j] = (term1 + term2) % MOD # 取模防止溢出 17 18 print(dp[k + 1][m + 1]) # 输出y^m项系数 19 20if __name__ == "__main__": 21 main()
代码解释:
dp = [[0]*1010 for _ in range(1010)]:创建1009×1009的二维数组(下标1开始)if j-1>=1 else 0:安全访问前一层的左上方元素| 维度 | C++实现 | Python实现 |
|---|---|---|
| 时间复杂度 | O(k2) | O(k2) |
| 空间复杂度 | O(k2) | O(k2) |
| 执行效率 | 较高(编译型语言) | 较低(解释型语言) |
| 代码简洁度 | 中等 | 较高 |
选择建议:
dp[j] = (prev[j-1]*b + prev[j]*a) % MOD