Recaman's Sequence
Time Limit: 3000MS |
|
Memory Limit: 60000K |
Total Submissions: 17688 |
|
Accepted: 7349 |
Description
The Recaman's sequence is defined by a0 = 0 ; for m > 0, a
m = a
m−1 − m if the rsulting a
m is positive and not already in the sequence, otherwise a
m = a
m−1 + m.
The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 ...
Given k, your task is to calculate a
k.
Input
The input consists of several test cases. Each line of the input contains an integer k where 0 <= k <= 500000.
The last line contains an integer −1, which should not be processed.
Output
For each k given in the input, print one line containing a
k to the output.
Sample Input
7
10000
-1
Sample Output
20
18658
Source
Shanghai 2004 Preliminary
一个[1, 500000]的数组,arr[0] = 0。假如a[i] = a[i - 1] - i大于等于0,且不存在数组中,就成立,否则,a[i] = a[i - 1] + i;
用一个标记数组来检测是否该元素已经存在数组中,用空间换时间。
注意点:
1)开标记数组不得超过10^7,否则MLE。开5*10^6即可
代码(1AC 1MLE):
#include <cstdio>
#include <cstdlib>
#include <cstring>
int arr[500020];
int flag[5000000];
void init(){
int i, j;
memset(flag , 0, sizeof(flag));
arr[0] = 0;
flag[0] = 1;
for (i = 1; i < 500010; i++){
if (arr[i - 1] - i >= 0){
if (flag[arr[i - 1] - i] == 1){
arr[i] = arr[i - 1] + i;
flag[arr[i]] = 1;
}
else if (flag[arr[i - 1] - i] == 0){
arr[i] = arr[i - 1] - i;
flag[arr[i]] = 1;
}
}
else{
arr[i] = arr[i - 1] + i;
flag[arr[i]] = 1;
}
}
}
int main(void){
int k;
init();
while (scanf("%d", &k), k != -1){
printf("%d\n", arr[k]);
}
return 0;
}