问题描述:
已知:集合S满足如下条件:
- 1属于S
- 若x属于S,则2x+1和3x+1也属于S
- 除了上述两条外,S中再无其他元素
- S中的元素按升序排列
求:S中指定的第N个元素
输入:若干case,每个case占用1行,只含一个整数表示N
输出:S中第N个元素的值
Sample Input:
100
254
Sample Output:
418
1461
思路:
首先,这是一道典型的递推题,类似的问题还有poj 1338、poj 2545和poj 2247
我们的基本思路是:设置三个游标p、q和i,p和q初始值均为0,i初始值为1,a[0] = 1。其中p用于生成2*a[p]+1,q用于生成3*a[q]+1,i用于指向数组a新生成的元素。然后有如下规则:
- 若2*a[p]+1 < 3*a[q]+1,则a[i] = 2*a[p]+1,且i++,p++
- 若2*a[p]+1 > 3*a[q]+1,则a[i] = 3*a[q]+1,且i++,q++
- 若2*a[p]+1 == 3*a[q]+1,则a[i] = 2*a[p]+1,且i++,p++,q++
代码:
#include <stdio.h>
#define SIZE 10000010
#define MIN(a, b) (a < b ? a : b)
long a[SIZE];
int main(){
long i2, i3;
i2 = i3 = 1;
a[1] = 1;
for(long i = 2; i < SIZE; i++){
a[i] = MIN(2*a[i2]+1, 3*a[i3]+1);
if(a[i] == 2*a[i2]+1) i2++;
if(a[i] == 3*a[i3]+1) i3++;
}
long t;
while(EOF != scanf("%ld", &t))
printf("%ld\n", a[t]);
return 0;
}