计算系数
题目链接:ybt高效进阶6-4-1 / luogu P1313
题目大意
给你一个多项式 (ax+by)^k,要你求展开后 x^n * y^m 这一项的系数。
思路
如果是 ( x + y ) k (x+y)^k (x+y)k 的话怎么做那就妇孺皆知了,直接是一个 C k n C_k^n Ckn 过去就好了。
然后现在是
(
a
x
+
b
y
)
k
(ax+by)^k
(ax+by)k,你考虑怎么搞。
考虑把它转回去
(
x
+
y
)
k
(x+y)^k
(x+y)k,那你展开后是
x
n
y
m
x^ny^m
xnym,就说明
x
x
x 这边乘了
n
n
n 次,
y
y
y 这边乘了
m
m
m 次,那跟着的
a
a
a 就乘了
n
n
n 次,
b
b
b 就是
m
m
m 次,那就一个快速幂过去就好了。
代码
#include<cstdio>
#define mo 10007
using namespace std;
int a, b, k, n, m, ans;
int ksm(int x, int y) {
int re = 1;
x %= mo;
while (y) {
if (y & 1) re = (re * x) % mo;
x = (x * x) % mo;
y >>= 1;
}
return re;
}
int inv(int x) {
return ksm(x, mo - 2);
}
int C(int n, int m) {
int re = 1;
for (int i = n + 1; i <= m; i++)
re = (re * i) % mo;
for (int i = 1; i <= m - n; i++)
re = (re * inv(i)) % mo;
return re;
}
int main() {
scanf("%d %d %d %d %d", &a, &b, &k, &n, &m);
ans = (ksm(a, n) * ksm(b, m)) % mo;
ans = (ans * C(n, k)) % mo;
printf("%d", ans);
return 0;
}