Blah数集-构造法

时间:2021-02-06 18:55:10

问题描述:

大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下:

(1) a是集合Ba的基,且a是Ba的第一个元素;

(2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;

(3)没有其他元素在集合Ba中了。

现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少?

AC代码

LL Ba[1000010];
int main()
{
    int a,n;
    while(cin >> a >> n)
    {
        Ba[1] = a;
        int x = 1,y = 1;// 轮到哪个元素"上"了
        for(int i = 2; i <= n; ++i)
        {
            Ba[i] = min(Ba[x] * 2 + 1, Ba[y] * 3 + 1);// 取较小
            if(Ba[i] == Ba[x] * 2 + 1)
                x++;
            if(Ba[i] == Ba[y] * 3 + 1)
                y++;
        }
        cout << Ba[n] << endl;
    }
    return 0;
}

算法描述:

本题与H数可谓是一模一样,代码也一模一样.

集合是具有互异性的,不能存在重复的元素.

同H数,每个元素都有机会去构造集合的下一个元素.

题面的特征是要求构造由给定规则生成的单调序列.

STL set正可以保证单调性和互异性.

STL 优先队列不能保证互异性.