计算系数

先导

根据高中的数学知识二项式定理,我们可以得到

(x+y)n=Cn0xny0+Cn11xn1y1+...+Cnnx0yn

我们可以这样理解,比如这样一个式子,(x+y)5

如果我们要求x3y2的系数,那么我们想象成有()()()()()个括号连续相乘,为了得到x3y2

我们需要从5个括号中选出3个来作为x相乘的项,即C53(x)3

另外还剩下两个括号,我们选出2个括号作为y相乘的项,即C22(y)2

最后把这两个分散的项相乘得到C53(x)3C22(y)2

推广

那么进行推广我们可以得到

(x+y+z)n如果要求xaybzc的系数

还是想象成有n个括号连续相乘

n个括号中选出a个凑成xa,即Cna(x)a

从剩下的na个括号选出b个凑出yb,即Cnab(y)b

最后从剩下的nab个括号中选出c个凑出zc,即Cnabc(z)c

最后的最后把这些分散的项相乘就是最终xaybzc的系数

(注意,我这里之所以要把x,y,z外面带上括号,就是因为某些情况下,x前面的系数可能不为1,这个时候还要把x前面的系数也算上)

比如要求x3y2

(2x+3y)5=C53(2x)3C22(3y)2

有了上面的知识储备,下面的这道题一定就非常简单了

真题

给定一个多项式(ax+by)k,请求出多项式展开后xnym项的系数。

输入格式

共一行,包含 5 个整数,分别为 abknm,每两个整数之间用一个空格隔开。

输出格式

输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。

数据范围

0n,mk1000
n+m=k
0a,b106

输入样例:

1 1 3 1 2 

输出样例:

3

题解

从连续的k个括号中选出n个作为凑成xn

Ckn(ax)n

从剩下的kn个括号中选出m个凑成ym

Cknm(by)m

最后答案Ckn(ax)nCknm(by)m

所以我们的代码只需要处理

anbm,还有组合数的计算就行

代码

#include <cmath>
#include <iostream>

using namespace std;
const int mod = 10007;
const int N = 1010;
int a, b, k, n, m;
int c[N][N];
void init() {
  for (int i = 0; i <= 1000; i++)
    for (int j = 0; j <= i; j++) {
      if (j == 0)
        c[i][j] = 1;
      else
        c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
    }
}

int qmi(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = (long long)ans * a % mod;
    a = (long long)a * a % mod;
    b >>= 1;
  }
  return ans % mod;
}
int main() {
  init();  //预处理出组合数
  cin >> a >> b >> k >> n >> m;
  cout << (long long)qmi(a, n) * qmi(b, m) * c[k][n] % mod;
  return 0;
}

本文作者:邦的轩辕

本文链接:https://www.cnblogs.com/bangdexuanyuan/p/14396904.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   邦的轩辕  阅读(528)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.