- 问题描述
-
集合S的定义如下: (1) 1在S内; (2) 如果x在集合S内,则2x+1与3x+1也在S内; (3) 只有满足条件(1)(2)的元素在S内. 把S中的元素按递增顺序排列,请输出S中的第N个元素。
- 输入
-
本题有多组测试数据。每组测试数据一行,每行一个正整数N (1 <= N <= 100000)。
- 输出
-
对每组测试数据,在单独的一行中输出S的第N个元素。
- 输入样列
-
1 2 3 4 5 6 100 254
- 输出样例
-
1 3 4 7 9 10 418 1461
思路阐述:这道题数据比较大有十万,如果用循环做,肯定超时TLE没得商量。所以肯定得有点技巧了,比如用布尔数组标记,如果某个数满足规则在集合中标记为true,否则标记为false。
这样集合元素的生成和排序就都解决了。
注意:这里有个小小的坑,如果循环定义为N=3000000;直接用来循环肯定会RE的,原因是下标越界,这个由于我也中过枪我就不说具体原因了,嘿嘿O(∩_∩)O~
好了,废话不多说,说好的代码来了!1 #include<stdio.h> 2 #define N 3000001 3 bool k[3*N]={0}; 4 int aim[N]={0}; 5 void f() 6 { 7 k[1]=true; 8 int i,j; 9 for(i=1;i<N;i++) 10 if(k[i]) 11 { 12 k[2*i+1]=true; 13 k[3*i+1]=true; 14 } 15 j=0; 16 for(i=0;i<N;i++) 17 { 18 if(k[i]) 19 aim[j++]=i; 20 } 21 22 } 23 int main() 24 { 25 int n; 26 f(); 27 while(~scanf("%d",&n)) 28 { 29 printf("%d ",aim[n-1]); 30 } 31 return 0; 32 }
//如有问题,欢迎留言O(∩_∩)O~