SSLZYC 二项式展开式

题目大意:
给出n,请展开(a+b)^n。


思路:
这道题看起来很难的样子,但是实际上非常简单。
我们可以先展开几个次数小的式子:
(a+b)^1=a+b
(a+b)^2=a^2+2ab+b^2
(a+b)^3=a^3+3a^2b+3ab^2+b^3
(a+b)^4=a^4+4a^3b+6a^2b^2+4ab^3+b^4
(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5

原来,这道题使有规律的!
对于(a+b)^n这个式子,展开后一定会形成n+1个单项式,每个单项式的系数又分别是杨辉三角第n+1行的数字,a在每个单项式里的次数从n开始递减到0,b在每个单项式里的次数从0开始递增到n。
那么,我们只需要求出杨辉三角第n行的数字,就可以很轻松的AC这道题啦!


代码:

#include <cstdio>
using namespace std;

long long f[101][101];
int n,a,b,k;

int main()
{
    freopen("power.in","r",stdin);
    freopen("power.out","w",stdout);
    scanf("%d",&n);
    f[1][1]=1;
    k=2;
    for (int i=2;i<=n+1;i++)
    {
        for (int j=1;j<=k;j++)
         f[i][j]=f[i-1][j]+f[i-1][j-1];  //求杨辉三角
        k++;
    }
    printf("(a+b)^%d=",n);
    a=n;  //a的次数
    b=0;  //b的次数
    n++;  //(a+b)^n为第n+1行杨辉三角的数字
    for (int i=1;i<=n;i++)
    {
        if (f[n][i]>1) printf("%lld",f[n][i]);  //输出系数
        if (a==1) printf("a");
        if (a>1) printf("a^%d",a);  //输出a和a的次数
        if (b==1) printf("b");
        if (b>1) printf("b^%d",b);  //输出b和b的次数
        if (i!=n) printf("+");
        a--;  //次数递减
        b++;  //次数递加
    }
    return 0;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313121.html