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\n",q[tail]); 35 } 36 return 0; 37 }
用单调队列,定义两个指针,分别表示2x+1和3x+1,每次计算后比较, 小者入队,对应指针后移,若两者相等,则两个指针同时后移。