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
题目意思不难理解就是第m个位置的数是根据第m-1位置的数推出来的如果a[m-1]-m>0,并且a[m-1]-m在前面的序列中没有出现过那么a[m] = a[m-1]-m否则a[m] = a[m-1]+m
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[500005]={0};
bool hash[10000000]={false};
int main()
{
int i;
for(i = 1;i<= 500000;i++)
{
if(a[i-1]-i>0 && !hash[a[i-1]-i])
a[i] = a[i-1]-i;
else
a[i] = a[i-1]+i;
hash[a[i]] = true;//hash[a[i]] = true,标志为已经出现过
}
while(~scanf("%d",&i),i>=0)
printf("%d\n",a[i]);
return 0;
}