2254. 二项式展开式(power)

2254. 二项式展开式(power)

题目描述
Smart最近在研究一个问题:
在整式的乘法中,我们知道(a+b)1=a+b,(a+b)2=a2+2ab+b2 ,等等,这些都可以用简单的手算求得。 但是我们如果要求的(a+b)^n展开式, 就不容易很快手算了。
Smart需要你去帮助他,这个时候应该如何去解答这个问题?

输入
输入仅一行,一个整数n。

输出
输出一行表达式,格式为:
(a+b)n=?an+?a(n-1)b+?a(n-2)b2+…+?b^n
其中" ? "为系数。如果系数为 1,则需要省略系数;如果次数为 1,则需要省略次数;如果次数为 0,则需要省略;如果系数为 0,则需要省略这一项。注意:前面(a+b)^n 的次数n是必有的。

样例输入
样例输入1

3

样例输入2

5

样例输出
样例输出1

(a+b)^3=a^3+3a^2b+3ab^2+b^3

样例输出2

(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5

数据范围限制
30%的数据:n≤18;
60%的数据:n≤34;
100%的数据:n≤66。

提示
在这里插入图片描述

思路:
类似的题目我们都只需找找规律,就欧了。

我们把每一项看成:系数* a次数 * b次数

将n=1,2,3,4的每一项的系数拿出来排列,如下图(杨辉三角):
在这里插入图片描述

对于每一项,a的次数呈降序排列,b的次数升序排列。

系数数据会很大(19位),注意开long long;

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
long long n,a[100010],tot=3;
int main()
{
	//fre(power);
	scanf("%lld",&n);
	a[1]=1,a[2]=2,a[3]=1;
	for(int i=3;i<=n;i++)
	{
		tot+=1;
		for(int i=tot;i>=1;i--)
			a[i]+=a[i-1];
	}
	printf("(a+b)^%lld=",n);
	if(n==1) {printf("a+b");return 0;} 
	for(int i=n;i>=0;i--) 
	{
		if(n-i) printf("+");
		if(a[n-i+1]>1) printf("%lld",a[n-i+1]);
		if(i)   
			if(i>1)  printf("a^%lld",i);	
			else printf("a"); 	
		if(n-i) 
			if(n-i>1)  printf("b^%lld",n-i);	
			else printf("b"); 	
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/107140513
今日推荐