7829:神奇序列求和
总时间限制: 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
来源
《奥数典型题举一反三(小学五年级)》 (ISBN 978-7-5445-2882-5) 模拟试卷一 第20题
题记:
这道题可以很明显地区分出程序员思维(计算机思维)和数学思维的不同解题办法:程序员思维第一反应是用计算机模拟操作,数学思维是找规律,找到公式解题。
下面分别给出两种代码。
程序员思维的C++代码:
// NOI-7829:神奇序列求和
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int n; //存放操作数n
int number[1024]; //用于模拟数列的数组
int count = 2; //记录数组中数的个数
int sum = 0; //存放和
cin >> number[0] >> number[1] >> n;
//模拟n步操作
for(int i=1; i<=n; i++){
//第二个数开始,往后移,每两个数之间留下空位放两数的和
for(int j=count-1; j>0; j--){
number[2*j] = number[j];
}
//每次操作数组多n-1个数,更新数组总数量
count += (count - 1);
//中间插入左右两数和
for(int j=1; j<count-1; j+=2){
number[j] = number[j-1] + number[j+1];
}
}
//求和
for(int j=0; j<count; j++){
sum += number[j];
}
cout << sum << endl;
return 0;
}
数学思维的C++代码:
#include <iostream>
using namespace std;
int main(){
int x, y, n, sum;
cin >> x >> y >> n;
ans = x + y;
for(int i=0; i<n; i++){
sum = sum * 3 - x - y;
}
cout << sum << endl;
return 0;
}