小明最近在研究一个问题:
在整式的乘法中,(a+b)^1=a+b(a+b)
,这些都很容易计算。 但是我们如果要求的(a+b)^n
展开式, 就不太容易了。
小明想请你帮他解决这个问题
输入格式
输入仅一行,一个整数 nn。
输出格式
输出一行表达式,格式为:(a+b)^ n =?a^ n+?a^ (n-1)b+?a^ (n-2)b^ 2+…+?b^n
其中?为系数。
注意,对于每一项:
如果系数为 11,则需要省略系数;
如果次数为 00,则需要省略这一项;
如果系数为 00,则需要省略这一项。
注意:前面(a+b)^n的次数 nn 是必有的。
数据范围
对于 30%30% 的数据,n \leq 15n≤15
对于 60%60% 的数据,n \leq 30n≤30
对于 100%100% 的数据,n \leq 60n≤60
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
4
样例输出复制
(a+b)^ 4=a^ 4+4a^ 3 b+6a^ 2b^ 2+4ab^ 3+b^4
本题刚开始看的时候很懵逼,但是我们无非处理的就是系数和指数的问题,所以,找到系数和指数的规律即可,查阅资料之后发现,多项式的系数为杨辉三角的每一列,对于指数,在草稿纸上推算之后,发现是a的指数分别从n->0,然后b的指数从0->n的过程,所以,这样就很明确了,先打印杨辉三角,然后循环处理即可,但是,注意一下,这里,如果第60行的话,那么可能会超过int范围,所以杨辉三角的数组可以用long long 来存储,直接上代码:
#include<iostream>
#include<memory.h>
using namespace std;
/*
@author:HaiRu,WU
@from:AHUT
*/
const int max_n=100;
/*
n次幂的系数就是杨辉三角的系数
1
1 1
1 2 1
1 3 3 1
*/
typedef long long ll;
int main(){
ll num[max_n][max_n];
memset(num,0,sizeof(num));
num[1][1]=1;
for(int i=2;i<max_n;i++){
for(int j=1;j<=i;j++){
num[i][j]=num[i-1][j-1]+num[i-1][j];
}
}
// for(int i=1;i<=20;i++){
// for(int j=1;j<=i;j++){
// cout<<num[i][j]<<" ";
// }
// cout<<endl;
// }
//
int n;
cin>>n;
if(n==0){
cout<<"(a+b)^"<<n<<"="<<1<<endl;
return 0;
}
int i=n; //a的系数
int j=0; //b的系数
cout<<"(a+b)^"<<n<<"=";
//输出第一项
int k=1;
//系数
if(num[n+1][k]!=1){
cout<<num[n+1][k];
}
//a
if(i==1){
cout<<"a";
}else if(i==0){
}else{
cout<<"a^"<<i;
}
//b
if(j==1){
cout<<"b";
}else if(j==0) {
}else{
cout<<"b^"<<j;
}
i--;
j++;
//输出剩余的几项
for(k=2;num[n+1][k]!=0;k++){
cout<<"+";
//系数
if(num[n+1][k]!=1){
cout<<num[n+1][k];
}
//a
if(i==1){
cout<<"a";
}else if(i==0){
}else{
cout<<"a^"<<i;
}
//b
if(j==1){
cout<<"b";
}else if(j==0) {
}else{
cout<<"b^"<<j;
}
i--;
j++;
}
return 0;
}