EricYang

Tech Spot of Eric

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Recaman's Sequence

Time Limit: 3000MS Memory Limit: 60000K
Total Submissions: 15860 Accepted: 6666

Description

The Recaman's sequence is defined by a0 = 0 ; for m > 0, am = am−1 − m if the rsulting am is positive and not already in the sequence, otherwise am = am−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 ak.

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 ak to the output.

Sample Input

7
10000
-1

Sample Output

20
18658

Source


 
水过
#include <iostream>
#include <cstring>

using namespace std;

bool record[40000000];

int main()
{
    int k;
    int am;

    while(cin>>k && k!=-1)
    {
        memset(record,0,sizeof(record));
        am=0;
        record[am]=true;
        for(int i=1; i<=k; i++)
        {
            if(am-i>0 && !record[am-i])
                am=am-i;
            else
                am=am+i;
            record[am]=true;
        }
        cout<<am<<endl;
    }

    return 0;
}
posted on 2011-05-31 21:16  Eric-Yang  阅读(218)  评论(0编辑  收藏  举报