ACM ICPC Greater NewYork Region 2015 Problem E-A Rational Sequence

博客详细介绍了ACM ICPC Greater NewYork Region 2015比赛中问题E的解决方案,即如何在满二叉树中根据给定的p和q找出对应的节点编号。通过分析规律,得出当p<q时为左子节点,p>q时为右子节点,p=q时为根节点。利用这些信息,可以计算出最左侧和最右侧节点的编号,并通过递归函数实现路径的遍历和节点编号的推导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题意理解:就是让你在满二叉树上寻找规律,根据给出的p,q推出对应的编号;

思路:显然,p<q时是左儿子,p>q是右儿子,p=q是根节点;然后继续观察规律;我们可以轻易求出位于树上最左边和最右边上的点的编号;分别为2^(q-1),2^q-1;

并且;如果不断沿着左儿子的方向走,q以p递增;右儿子则p以q递增;所以只要我们知道一个起点就可以推出它所有后继点的编号。我们可以利用树的特性,写一个很方便的递归函数,减少代码量。

代码:

#include<bits/stdc++.h>
long long work(long long p,long long q)//求出值为p/q的点的编号
{
	long long a,k,ans;
	if(p==1&&q==1)
	return 1;
	if(p==0||q==0)
	return 1;
	if(p>q)//右儿子
	{
		k=p/q;
		if(p%q==0)//到达根节点时,特判,下同
		k--;
		a=work(p%q,q);
		ans=pow(2,k)*a+pow(2,k)-1;//找规律
		return ans;
	}
	else if(p<q)//左儿子
	{
		k=q/p;
		if(q%p==0)
		k--;
		a=work(p,q%p);
		ans=pow(2,k)*a;//找规律
		return ans;
	}
}
int main()
{
	long long t,p,q,a;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld %lld/%lld",&a,&p,&q);
		printf("%lld %lld\n",a,work(p,q));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值