A 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019))
題目描述
歡迎報(bào)考JWJU!這里有豐富的社團(tuán)活動(dòng),比如為夢(mèng)想奮斗的ACM集訓(xùn)隊(duì),經(jīng)常組織飛行棋的桌游協(xié)會(huì),喜歡“唱,跳,rap,籃球”的籃球協(xié)會(huì),更奇特的是——讓人耳目一新的攀樹(shù)協(xié)會(huì)。顧名思義,攀樹(shù)協(xié)會(huì)會(huì)經(jīng)常組織大家攀爬一些樹(shù),比如李超樹(shù),左偏樹(shù),帶花樹(shù),智慧樹(shù)等等。經(jīng)過(guò)社團(tuán)組織的一番培訓(xùn)后,同學(xué)們已經(jīng)學(xué)會(huì)了如何在樹(shù)上的相鄰結(jié)點(diǎn)中來(lái)回爬動(dòng)。
不過(guò)上述的樹(shù)太沒(méi)意思了,RegenFallen同學(xué)向往更刺激的挑戰(zhàn),今天他要挑戰(zhàn)的項(xiàng)目是一棵完全 k 叉樹(shù)。
完全k叉樹(shù)的定義:一個(gè) m 層的完全 k 叉樹(shù)的前 m?1 層均為滿(mǎn) k 叉樹(shù),且第 m 層的結(jié)點(diǎn)全部聚集在樹(shù)的左側(cè)。
因?yàn)镽egenFallen是一個(gè)持久的男人,所以他希望一次能爬盡量長(zhǎng)的路徑(不走重復(fù)的點(diǎn)),所以他想讓你告訴他,假如現(xiàn)在有一棵 n 個(gè)點(diǎn)的完全 k 叉樹(shù),每條邊的長(zhǎng)度均為 1,從樹(shù)上的某一點(diǎn)到另一點(diǎn)的最大距離是多少。
輸入描述
第一行給出一個(gè) t (t≤1e4) 代表測(cè)試用例的組數(shù)。
接下來(lái)t行,每行包含兩個(gè)正整數(shù) k, n (1 <= k <= 10^9, 2 <= n <= 10^9) 意義如題面所示。
輸出描述
對(duì)于每個(gè)測(cè)試用例,輸出一行一個(gè)正整數(shù)表示答案。
樣例輸入
1
2 3
樣例輸出
2
提示
樣例給出了一個(gè)3個(gè)點(diǎn)的完全二叉樹(shù),即第一層有一個(gè)點(diǎn),第二層有兩個(gè)點(diǎn)。那么可以選擇第二層的兩個(gè)點(diǎn)來(lái)計(jì)算距離,其距離為2,即為樹(shù)上的最大距離。
?
思路:以3叉樹(shù)為例,首先需要計(jì)算出樹(shù)的深度以及是不是滿(mǎn)n叉樹(shù)。
有以下兩種種情況。是滿(mǎn)n叉樹(shù)或者不是滿(mǎn)n叉樹(shù)但是最后一層剩下的結(jié)點(diǎn)有在第2,3棵大子樹(shù)上面(比如3叉樹(shù) 結(jié)點(diǎn)8 9 10 都在第二棵大子樹(shù)上),其最大的距離就是左下角到最后一個(gè)結(jié)點(diǎn),為k-1+k-1-1。其他情況就是最左下的結(jié)點(diǎn)和最右側(cè)最下面結(jié)點(diǎn)的距離,為k-1+k-1。(具體注釋看代碼)
注意 3 10和樣例3 8還有特判1的情況;
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <sstream> #include <cstdio> #include <vector> #include <string> #include <cmath> #include <stack> #include <queue> #include <map> #include <set> #define MAX 0x3f3f3f3f #define fori(a,b) for(int i=a;i<=b;i++) #define forj(a,b) for(int j=a;j<=b;j++) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const double PI = acos(-1); const int M=1e5+10; #define inf 0x3f3f3f int main() {ll T,n,m,mod,i,k,flag=0,ans=1,p;scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&m);if(n==1){printf("%lld\n",m-1);continue;}p=n;//p是當(dāng)前深度上是滿(mǎn)的情況下結(jié)點(diǎn)的個(gè)數(shù)k=1;//k是樹(shù)的深度m=m-1;//m是當(dāng)前結(jié)點(diǎn)剩余個(gè)數(shù)int flag=0;//樹(shù)是滿(mǎn)叉數(shù)while(1){if(m-p>=0){k+=1;m-=p;p*=n;}elsebreak;}if(m!=0)//還有剩余的結(jié)點(diǎn){k+=1;p/=n;if(m<=p)//結(jié)點(diǎn)都在第一棵大子樹(shù)上面flag=1;}if(flag==1)printf("%lld\n",k-1+k-1-1);elseprintf("%lld\n",k-1+k-1);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的A 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: asp.net网页上嵌入Flash显示
- 下一篇: CCPC-Wannafly Comet