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;
}