题解:P1313 [NOIP2011 提高组] 计算系数

· · 题解

## 公式推导 大佬们的公式太复杂。让我这个蒟蒻好好推导一下。 首先,我们来看几个多项式展开: $$ (a+b)^2=1a^2+2ab+1b^2 $$ $$ (a+b)^3=1a^3 + 3a^2b + 3ab^2 + 1b^3 $$ $$ (a+b)^4=1a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + 1b^4 $$ $$ (a+b)^5=1a^5 + 5a^4b + 10a^3b^2 + 10a^2b^3 + 5ab^4 + 1b^5 $$ 我们可以发现,每一项系数都以某种规律排列,每一项而指数的和都为展开前的指数。 然而这种规律就是杨辉三角的数列。杨辉三角可以写成组合数 $C^n_m$ 的形式(其中 $C^n_m$ 也可写作 ${m \choose n}$,表示 $\dfrac{n!}{m!(n-m)!}$,其中 $x!=\prod\limits^x_{i=1}i=x(x-1)(x-2)\dots1$,特别地 $0!=1$),所以我们可以得出: $$ (a+b)^k=C^0_ka^kb^0+C^{1}_ka^{k-1}b^1+C^2_ka^{k-2}b^2+\dots+C^{k}_{k}a^0b^k $$ 我们用 $\sum$ 列出通项公式。 $$ (a+b)^k = \sum_{n=0}^{k} C^{n}_{k} a^{k-n} b^n $$ 现在我们设 $a'=ax,b'=by$,代入得: $$ (a'+b')^k=\sum_{n=0}^{k} C^{n}_{k} a'^{k-n} b'^n $$ 我们将 $a'$ 和 $b'$ 变回原来的形式: $$ (ax+by)^k=\sum_{n=0}^{k} C^{n}_{k} (ax)^{k-n} (by)^n $$ 我们就求出了多项式分解的公式。 ## 思路 为了求解本题,我们需要对此公式拆解成每一项求解公式: $$ a^nb^m=C^{m}_{k} x^{n}y^m a^{n}b^m\bmod10007 $$ 系数即为 $C^{m}_{k} x^{n}y^m\bmod10007$。其中 $C^m_k=C^{m-1}_{k-1}+C^{m}_{k-1}$。 这道题就做出来了。 ## 代码 ```cpp #include<bits/stdc++.h> #define int long long //其实不用 long long 也能过。 using namespace std; const int mod=1e4+7; int poww(int x,int p){//快速幂 int result=1; while(p>0){ if(p%2)result=result*x%mod; p/=2; x=x*x%mod; } return result; } int c[1005][1005];//这里的c[i][j]=c^i_j signed main(){ int a,b,k,n,m; cin>>a>>b>>k>>n>>m; c[0][0]=1; for(int i=1;i<=k;c[i][0]=c[i][i]=1,i++); for(int i=1;i<=k;i++){ for(int j=1;j<i;j++){ c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;//公式 } } cout<<c[k][n]*(poww(a,n)*poww(b,m)%mod)%mod<<endl; return 0; } ``` #### 后记 $\KaTeX$ 都快敲炸了,给个赞在走吧。