分析&&题解:
给出一个数,计算它在这颗树中的序号,因为,这颗树的子节点都是由根节点推出的,那么我们可以从这个数反推其父节点,知道推到根节点,然后递归回去的时候开始计算树的分支,得出最后的结果。DFS代码解析:
int DFS(int n, int m)
{
if(n==m) //抵达根节点
return 1; //返回根节点序号为1
else
{
int ans;
long long mn = min(m, n);
long long mx = max(m, n);
if(mn == n) //这个if/else为推断父节点
ans = DFS(mn, mx-mn);
else
ans =DFS(mx-mn, mn);
if(mn == n) //当前为左节点,序号为父节点序号乘2
return ans<<1;
else//当前为右节点,序号为父节点序号乘2加1
return ans<<1|1;
}
}
- AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
long long n,m;
int DFS(int n, int m)
{
if(n==m)
return 1;
else
{
int ans;
long long mn = min(m, n);
long long mx = max(m, n);
if(mn == n)
ans = DFS(mn, mx-mn);
else
ans =DFS(mx-mn, mn);
if(mn == n)
return ans<<1;
else
return ans<<1|1;
}
}
int main()
{
int P;
scanf("%d", &P);
while(P--)
{
int K;
scanf("%d %lld/%lld", &K, &n, &m);
printf("%d %lld\n", K, DFS(n, m));
}
}