多项式展开的项数计算。假设
f(x)=(x1+n2+...+xn)kf(x) = (x_1+n_2+...+x_n)^kf(x)=(x1+n2+...+xn)k
求不同的项数目,例如 x1kx_1^kx1k,x2kx_2^kx2k和x11x2k−1x_1^1x_2^{k-1}x11x2k−1是不同的项。
用排列组合的知识,一共有两个步骤。
- 选定变量
- 分配每个变量的幂
选定变量
xikx_i^kxik次幂的项数可以看作是从[x1,x2,...,xn][x_1, x_2, ...,x_n][x1,x2,...,xn]中选择一变量,一共nnn个选择。xiaxjk−ax_i^ax_j^{k-a}xiaxjk−a是选择两项,n∗(n−1)2\frac{n*(n-1)}{2}2n∗(n−1), 依次类推每m个变量组成的单项式可以有CnmC_n^mCnm种选择。
分配每个变量的幂
在选定变量之后,就需要指定次幂。假设我们已经选定mmm个变量,mmm个变量幂的和为kkk。用插挡板的办法得到,在kkk个小球中插入m−1m-1m−1个挡板将其划分为mmm个区间,每个区间的值就是对应变量的次幂,也就是k−1k-1k−1个位置中选择m−1m-1m−1个位置,共有Ck−1m−1C_{k-1}^{m-1}Ck−1m−1种划分办法。
合起来,f(x)=(x1+n2+...+xn)kf(x) = (x_1+n_2+...+x_n)^kf(x)=(x1+n2+...+xn)k项数公式表示为
∑i=1kCniCk−1i−1\sum_{i=1}^{k} C_n^iC_{k-1}^{i-1}i=1∑kCniCk−1i−1
Python实现
from functools import reduce
from operator import mul
def combination(n, k):
if k == 0 or k == n:
return 1
dividend = reduce(mul, (i for i in range(n-k+1, n+1)))
divisor = reduce(mul, (i for i in range(1, k+1)))
return dividend/divisor
def nums_of_polynomial(n, k):
# n是变量数, k是次幂
total = 0
for i in range(1, k+1):
total += combination(n, i)*combination(k-1, i-1)
return int(total)