总时间限制:
1000ms
内存限制:
65536kB
描述
有一个序列,初始时只有两个数x和y,之后每次操作时,在原序列的任意两个相邻数之间插入这两个数的和,得到新序列。举例说明:
初始:1 2
操作1次:1 3 2
操作2次:1 4 3 5 2
……
问操作n次之后,得到的序列的所有数之和是多少?
输入
三个整数x,y,n,相邻两个数之间用单个空格隔开。0 <= x <= 5, 0 <= y <= 5, 1 < n <= 10。
输出
一个整数,即最终序列中所有数之和。
样例输入
1 2 2
样例输出
15
#include <bits/stdc++.h>//Writed by Wangzhimin Date:2022.05.30
using namespace std;
int a,b,n;
#define Max 1600
int tmp[12][Max];//用数组存每次的值,列要足够大,1500还不行呢
int main()
{
int x,sum=0;
scanf("%d%d%d",&a,&b,&n);
memset(tmp,-1,sizeof(tmp));//初始为-1,因为可以是0值,无法判断结束标志
tmp[0][0]=a,tmp[0][1]=b;//第一行的两个值
for(int i=0;i<n;i++)//从第0行开始计算下行的,即第一次的依次
{
x=0;//每次下列要加上2
for(int j=0;j<Max;j++)//列,从0开始计算下行的
{
tmp[i+1][x]=tmp[i][j];// 第一个列的数下来,不动
if(tmp[i][j+1]!=-1)//如果不是最后出列了 ,不用再做加法了
tmp[i+1][x+1]=tmp[i+1][x]+tmp[i][j+1];//把上个数(不动的那个)与它的下一个列的相加,放在下一行
x=x+2;//下列的加2 ,因为计算了两个数。
}
}
for(int i=n,j=0;j<Max;j++)//第n次操作的在第n行。
{
if(tmp[i][j]==-1)
break;
else
sum+=tmp[i][j];
}
cout<<sum<<endl;
/*for(int i=0;i<=n;i++){
for(int j=0;j<2000;j++)
cout<<tmp[i][j]<<" ";
cout<<endl;} */
}