题目大意:
给出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;
}