http://poj.org/problem?id=2081
Recaman's Sequence
Time Limit: 3000MS | Memory Limit: 60000K | |
Total Submissions: 18439 | Accepted: 7678 |
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.
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
The last line contains an
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
题意:
如果a[m−1] − m为正数&&且未在序列中出现则a[m] = a[m−1] − m,否则a[m] = a[m−1] + m
这题最容易re了。一开始不知道怎么处理每个数都不一样,后来学到用f[a[i]]=1来表示相同。。这个太好了。。还有就是re的原因是要先打表(以前不知道原来这个就是打表啊)。。不打表就会re。。
- Source Code
#include<stdio.h> #include<string.h> int a[500010]; int f[10000000]; int main() { int n; int i; memset(f,0,sizeof(f[0])); f[0]=1;a[0]=0;//打表 for(i=1;i<500010;i++) { if(f[a[i-1]-i]==0&&a[i-1]-i>0) { a[i]=a[i-1]-i; f[a[i]]=1; } else { a[i]=a[i-1]+i; f[a[i]]=1; } } while(scanf("%d",&n)!=EOF&&n!=-1) printf("%d\n",a[n]); return 0; }