原题网址
由于某些原因,这个网址会进不去…
题目描述
光光最近在研究一个问题:在整式的乘法中,我们知道 ( a + b ) 1 = a + b , ( a + b ) 2 = a 2 + 2 a b + b 2 (a+b)^{1}=a+b, (a+b)^{2}=a^{2}+2ab+b^{2} (a+b)1=a+b,(a+b)2=a2+2ab+b2 ,等等,这些都可以用简单的手算求得。但是我们如果要求的 ( a + b ) n (a+b)^{n} (a+b)n 展开式,就不容易很快手算了。光光需要你去帮助他,这个时候应该如何去解答这个问题?
格式
输入格式
输入仅一行,为 n n n的值。
输出格式
输出只需输出一行表达式,格式为:
(a+b)^n=*a^n+*a^(n-1)b+*a^(n-2)b^2+…+*b^n
其中
∗
*
∗为系数。
注意:
- 如果系数为0,则需要省略该项
- 如果系数为1,则需要省略系数
- 如果次数为0,则需要省略次数
- 如果次数为1,则需要省略次数
- 前面
(a+b)^n
的次数是必有的
样例
输入样例
5
输出样例
(a+b)^5=a^5+5a^4b+10a^3b^2+1a^2b^3+5ab^4+b^5
说明
30
%
30\%
30%的数据中,
n
≤
18
n\le18
n≤18;
60
%
60\%
60%的数据中,
n
≤
34
n\le34
n≤34;
100
%
100\%
100%的数据中,
n
≤
66
n\le66
n≤66;
提示:无须使用高精度
作者表示:非常良心啊!
解题思路
观察各项的系数,可以发现其值为杨辉三角对应行的数。
即当
n
=
5
n=5
n=5时,各项系数分别为1,5,10,10,5,1
。
而各项的次数也与
n
n
n的值有关系。
因此,可以利用
f
o
r
for
for循环来输出。
Code
#include<bits/stdc++.h>
#define maxn 100
using namespace std;
long long n, a[maxn + 1];
void init() // 在此执行预处理
{
cin>>n;
a[1] = 1; // 初始化杨辉三角
for (int i = 1; i <= n; i ++) for (int j = i + 1; j >= 1; j --) a[j] += a[j - 1];
// 使用一维数组计算杨辉三角
printf("(a+b)^%d=", n);
}
void oput() // 在此输出结果
{
for (int i = 1; i <= n; i ++)
{
if (a[i] == 0) continue; // 如果系数为0,则不输出(可以省略)
if (a[i] != 1) cout<<a[i];
cout<<"a";
if (n - i) printf("^%d", n - i + 1);
if (i - 1) cout<<"b";
if (i > 2) printf("^%d", i - 1);
cout<<"+";
// 以上if内的逻辑就是判断要不要输出(如判断次数是否为0或1)
}
if (n - 1) printf("b^%d", n);
else cout<<"b"; // 当n=1时,即输出b
}
int main()
{
init();
oput();
// 模块化处理!
return 0;
}
大功告成 ∼ \sim ∼