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