Blah数集

描述大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素; (2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中; (3)没有其他元素在集合Ba中了。 现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少?输入输入包括很多行,每行输入包括两个数字,集合的基a(1<=a<=50))以及所求元素序号n(1<=n<=1000000)输出对于每个输入,输出集合Ba的第n个元素值样例输入

1 100
28 5437

样例输出

418
900585
 1 #include<cstdio>
 2 using namespace std;
 3 const int N = 1000010;
 4 long long h2,h1,tail;
 5 long long q[N],a,n;
 6 
 7 int main()
 8 {
 9     while(scanf("%d%d",&a,&n)>0)
10     {
11         h1 = h2 = tail = 1;
12         q[1] = a;
13         while(tail < n)
14         {
15         long long t1 = (q[h1] << 1)+1;
16         long long t2 = (q[h2]<<1)+q[h2]+1;
17         if(t1 < t2)
18         {
19             q[++tail] = t1;
20             h1++;
21         }
22         else if(t1 > t2)
23         {
24             q[++tail] = t2;
25             h2++;
26         }
27         else
28         {
29             q[++tail] = t1;
30             h1++;
31             h2++;
32         }
33         }
34         printf("%d
",q[tail]);
35     }
36     return 0;
37 }

用单调队列,定义两个指针,分别表示2x+1和3x+1,每次计算后比较, 小者入队,对应指针后移,若两者相等,则两个指针同时后移。

原文地址:https://www.cnblogs.com/peppa/p/9605988.html