再一次温习高中知识,才明白高中知识很有用!
题意:多项式(x1+x2+...+xk)^n.
输入n和k(0<k,n<13),分别表示多项式次数和变元数。第二行为k个非负整数n1,n2,...nk,满足n1+n2+...nk=n.输出多项式(x1+x2+...+xk)n展开后的(x1)^n1*(x2)^n2...(xn)^nk这一项的系数。
思路:根据高中知识,我们知道(a+b)^n的各项系数,可以先把上述多项式转换成两项即
(x1+x2+...+xk-1+xk)^n = (Sk-1+xk)^n 即有一项这样的:C(n,m)*Sk-1^m*xk^nk,其中m=n-nk
也就是该项系数C(n,m)=C(n,n-nk)
再求Sk-1^m=(x1+x2+...+xk-2+xk-1)^m =(Sk-2+xk-1)^m 即有一项这样的:C(m,h)*Sk-2^h*xk-1^nk-1 其中h=m - nk-1
也就是该项系数C(m,h)=C(m,m - nk-1)=C(n - nk, n- nk - nk-1),所以一直递归就行
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stdio.h>
using namespace std;
int a[20];
int c[15][15];
void cff()
{
c[0][0]=c[1][0]=c[1][1]=1;
for(int i=2; i<=13; i++)
{
c[i][0]=c[i][i]=1;
for(int j=1; j<=13; j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
}
int main()
{
cff();
int n,k;
while(scanf("%d%d",&n,&k)==2)
{
for(int i=1; i<=k; i++)
scanf("%d",&a[i]);
long long sum=1;
int j=k;
while(j>=1)
{
sum*=c[n][a[j]];
n-=a[j];
j--;
}
printf("%lld\n",sum);
}
return 0;
}