題目大意
有一個深度爲d的樹 一個小球從根節點往下落 每個節點都有開關 而且一開始都是關閉狀態 當小球落到這個節點上 它的狀態纔會改變 然後當小球到達一個節點時,如果是關閉就往左走,如果是開的就往右走 問 給你一個數n 問你這第n個球會落在哪個節點上
解題思路
首先我們要知道
父親節點 是 n 的話,左子節點就是2n 右子節點是 2n+1;
本題中 根節點是1 那它左子節點就是 21=2 右子節點是21+1=3
我們一看就知道 第一個球一定是往左走的 第二個球一定是往右走的
一個節點的開關狀態也是與小球是第幾次經過那個節點有關 奇數次就往左走 偶數次就往右走 結合起來就是 這個小球的編號是奇數的話 那它就是往左走的第(m+1)/2個小球 如果是偶數 就是往右走的第(m/2)個小球 編號也隨之變化 一共有n層 遍歷下來就可
代碼如下
#include<iostream>
using namespace std;
int main()
{
int t;
int n,m,k,i;
while(cin>>t)
{
if(t<0)
break;
while(t--)
{
cin>>n>>m;
k=1;
for(i=1;i<n;i++)
{
if(m%2==0)
{
k=k*2+1;
m=m/2;
}
else
{
k=k*2;
m=(m+1)/2;
}
}
cout<<k<<endl;
}
}
return 0;
}