「一本通 6.6 例 1」计算系数

GitHub跳转原题关系图返回列表

二项式定理一步到位:x^n y^m 项系数 = C(k,n)·a^n·b^m mod 10007,组合数 + 快速幂即可。

OJ: roj

题目 ID: 1648

难度:入门

标签:数学二项式定理快速幂组合数

创建: 2026-09-30 23:55

更新: 2026-10-06 01:38

题目描述

给定整数 a,b,k,n,ma,b,k,n,m(0≤n,m≤k0\le n,m\le k 且 n+m=kn+m=k,0≤a,b≤1060\le a,b\le 10^6),求多项式 (ax+by)k(ax+by)^k 展开后 xnymx^ny^m 项的系数,结果对 1000710007 取模。

输入一行 5 个整数 a,b,k,n,ma,b,k,n,m;输出一行一个整数,即所求系数模 1000710007 的值。

样例输入 1 1 3 1 2 时,(x+y)3=x3+3x2y+3xy2+y3(x+y)^3=x^3+3x^2y+3xy^2+y^3,xy2xy^2 项系数为 33,样例输出 3。

思路

由二项式定理,(ax+by)k(ax+by)^k 展开后 xnymx^n y^m 项(m=k−nm=k-n)的系数唯一为 (kn)⋅an⋅bm\binom{k}{n}\cdot a^n\cdot b^m。k≤1000k\le 1000,用杨辉三角递推 O(k2)O(k^2) 求出 (kn)\binom{k}{n},ana^n、bmb^m 用快速幂,全程对 1000710007 取模即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-30 23:55
# update_at: 2026-09-30 23:55

import sys
from math import comb

MOD = 10007  # 题面指定的模数(是质数,但 k <= 1000 时直接算精确组合数再取模即可)


def coefficient(a: int, b: int, k: int, n: int, m: int) -> int:
    """二项式定理:(ax+by)^k 展开后 x^n y^m 的系数 = C(k,n) * a^n * b^m。"""
    return comb(k, n) * pow(a, n, MOD) % MOD * pow(b, m, MOD) % MOD


def solve() -> None:
    a, b, k, n, m = map(int, sys.stdin.buffer.read().split())
    print(coefficient(a, b, k, n, m))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-06 01:38
 * update_at: 2026-10-06 01:38
 */

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll MOD = 10007; // 题面指定的模数

ll a, b, k, n, m;

// 快速幂:求 p^e mod MOD
ll qpow(ll p, ll e) {
    ll ret = 1;
    while (e > 0) {
        if (e & 1)
            ret = ret * p % MOD;
        p = p * p % MOD;
        e >>= 1;
    }
    return ret;
}

int main() {
    cin >> a >> b >> k >> n >> m;

    // 用杨辉三角递推求 C(k, n):c[j] 表示 C(i, j),逐行更新
    ll c[1005] = {0};
    c[0] = 1;
    for (ll i = 1; i <= k; i++)
        for (ll j = i; j >= 1; j--)
            c[j] = (c[j] + c[j - 1]) % MOD;

    // 二项式定理:x^n y^m 项的系数 = C(k,n) * a^n * b^m
    ll ans = c[n] * qpow(a, n) % MOD * qpow(b, m) % MOD;
    cout << ans << endl;
    return 0;
}