1. 程式人生 > >Blah數集-構造法

Blah數集-構造法

int 有趣 高斯 stl main ret 自然 數學家 隊列

問題描述:

大數學家高斯小時候偶然間發現一種有趣的自然數集合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 優先隊列不能保證互異性.

Blah數集-構造法