Blah数集

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


单调队列解决,第一次提交不知为什么output limit exceede,后来换成long long,把数组开大了一个号就ac了,注意使用位运算,减少运行时间


#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
long long que[1000001];
int main(){
    long long m,n;
    while(scanf("%lld%lld",&m,&n) > 0){
        long long h1,h2,tail;
        tail = 1;
        h1 = 1;
        h2 = 1;
        que[1] = m;
        while(tail < n){
            long long t1 = (que[h1]<<1) + 1,t2 = que[h2] * 3 + 1;      //之所以用h1,h2是因为比较大的后入队列,因为可能出现后面的2*x + 1 可能小于前面的3*x + 1等诸如此类的情况。
            if(t1 < t2){
                que[++tail] = t1;
                h1 ++;
            }else if(t1 > t2){
                que[++tail] = t2;
                h2++;
            }else{
                que[++tail] = t2;
                h1++;
                h2++;
            }
        }
        printf("%lld\n",que[tail]);
    }
    return 0;
} 
posted @ 2018-01-20 15:21  WenOI  阅读(957)  评论(0编辑  收藏  举报
水波背景