Comet OJ 夏季歡樂賽 徹底k叉樹

徹底k叉樹html

https://cometoj.com/contest/59/problem/A?problem_id=2712markdown

題目描述測試

 

歡迎報考JWJU!這裏有豐富的社團活動,好比爲夢想奮鬥的ACM集訓隊,常常組織飛行棋的桌遊協會,喜歡「唱,跳,rap,籃球」的籃球協會,更奇特的是——讓人耳目一新的攀樹協會。顧名思義,攀樹協會會常常組織你們攀爬一些樹,好比李超樹,左偏樹,帶花樹,智慧樹等等。通過社團組織的一番培訓後,同窗們已經學會了如何在樹上的相鄰結點中來回爬動。flex

不過上述的樹太沒意思了,RegenFallenRegenFallen同窗嚮往更刺激的挑戰,今天他要挑戰的項目是一棵徹底 kk 叉樹。spa

徹底kk叉樹的定義:一個 mm 層的徹底 kk 叉樹的前 m-1m1 層均爲滿 kk 叉樹,且第 mm 層的結點所有彙集在樹的左側。code

由於RegenFallenRegenFallen是一個持久的男人,因此他但願一次能爬儘可能長的路徑(不走重複的點),因此他想讓你告訴他,假如如今有一棵 nn 個點的徹底 kk 叉樹,每條邊的長度均爲 11,從樹上的某一點到另外一點的最大距離是多少。htm

 

 
 

輸入描述blog

 

第一行給出一個 tt (t≤10^{4}t104) 表明測試用例的組數。get

接下來t行,每行包含兩個正整數 k, nk,n (1 \le k \le 10^9, 2 \le n \le 10^91k109,2n109) 意義如題面所示。
input

 

輸出描述

 

對於每一個測試用例,輸出一行一個正整數表示答案。

 

樣例輸入 1 

1
2 3

樣例輸出 1

2

提示

樣例給出了一個3個點的徹底二叉樹,即第一層有一個點,第二層有兩個點。那麼能夠選擇第二層的兩個點來計算距離,其距離爲2,即爲樹上的最大距離。

 

模擬題,累加層數分類討論可AC

CODE;

#include<cstdio>
#define ll long long
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll k,n;
        scanf("%lld%lld",&k,&n);
        if(k==1)
        {
            printf("%lld\n",n-1);
            continue;
        }
        ll temp=1,cnt=0;
        while(n)
        {
            n-=temp;
            cnt++;
            temp*=k;
            if(n<temp)
                break;
        }
        if(n==0)
            printf("%lld\n",cnt*2-2);
        else if(n<=temp/k)
            printf("%lld\n",cnt*2-1);
        else
            printf("%lld\n",cnt*2);
    }
    return 0;
}
相關文章
相關標籤/搜索