浅谈YBH算法1——YBH规律

ybh 本人
在算法世界中,有许多算法由YBH命名。这些算法是由我国算法家杨秉涵(2007——)发明的,主要包括YBH规律、YBH网络流、YBHdp,以及数据结构YBHTree、YBHST表等。今天先介绍最简单的YBH规律。
YBH规律是一种十分玄学的算法,它可以在最多线性的时间复杂度中解决一些难题,被OIer戏称为“蒟蒻的快乐,大佬的眼泪”。
先从一道经典的YBH规律例题入手
CF1543A Exciting Bets
题目大意:
给你两个非负整数a,b ,你可以对它们做如下操作:

  1. 两个数同时加1
  2. 两个数同时减1,前提是两个数都是正数

注意: g c d ( x , 0 ) = x gcd(x,0)=x gcd(x,0)=x。经过一番操作,问能够构成的最大的 g c d ( a , b ) gcd(a,b) gcd(a,b) 为多少?若该值可以达到无限,那么输出两个0,否则输出最大的 g c d ( a , b ) gcd(a,b) gcd(a,b) 以及操作步数。
看起来,这道题很难,但实际上,这道题通过YBH规律算法能够轻松求解。先来观察样例数据。

4
8 5
1 2
4 4
3 9

其中第一行之后的每一行为一组数据,分别为a和b。再来看看它们对应的输出

3 1
1 0
0 0
6 3

看到第三组数据,输出了0,说明 g c d ( a , b ) gcd(a,b) gcd(a,b) 可以无限。而4和4相等,看到这里,大家应该都知道了,只要两个数相等,结果就是无限。
继续观察第1、2、4组数据。发现这个最大的 g c d ( a , b ) gcd(a,b) gcd(a,b) 其实就是a与b差值的绝对值。下面让我们来解释:(不想看的可以自动跳过)

假设我们将a和b直接减到0和b-a(假设 a < b a<b a<b,当然可以调换),那么此时, g c d ( a , b ) = b − a gcd(a,b)=b-a gcd(a,b)=ba,然而在a与b固定差值的情况下(同时加减差值不变), g c d ( a , b ) gcd(a,b) gcd(a,b) 不可能比 b − a b-a ba 更大了(有兴趣的读者可以自己试验),因此

g c d ( a + x , b + x ) , ( a ≠ b , x ≥ m i n ( − a , − b ) gcd(a+x,b+x),(a≠b,x≥min(-a,-b) gcd(a+x,b+x),(a=b,xmin(a,b)且为整数 ) ) )

的最大值为 b − a b-a ba

那操作步数怎么算呢?
首先,要么一直加,要么一直减,不可能又加又减。那么什么时候 g c d ( a , b ) = b − a gcd(a,b)=b-a gcd(a,b)=ba 呢?很明显,只有三种情况:

  1. a b = 0 ab=0 ab=0
  2. a b = b − a \frac{a}{b}=b-a ba=ba
  3. b a = b − a \frac{b}{a}=b-a ab=ba

意思就是说,a和b都是 b − a b-a ba 的倍数。那么我们只需要选择离原来的a,b近的 b − a b-a ba 的倍数来计算步数即可。单组数据的时间复杂度为 O ( 1 ) O(1) O(1)。代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if(a>b) swap(a,b);
		if(a==b) printf("0 0\n");
		else printf("%d %d\n",b-a,min(b%(b-a),b-a-b%(b-a)));
	}
	return 0;
}

(注:原OJ提交需要开long long,否则会溢出)

总结一下,YBH规律的核心思想是把一道题分成三步来做:

  1. 猜想结果
  2. 证明猜想
  3. 代码实现

正如杨秉涵在初中的信息学老师何异所言,做一道找规律的题目,需要“大胆猜想,小心求证”。

Request body { "data": "string" } 我想把这个{ "data": "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", "encryptKey": "L7392SXY6UlpMeulyypjdmPNK+CFOHxpaBSOp+8CEQcy/+AXh5xozsAfgJlzUGIQbLsWXVcUELsYq2zhZbpusFaeLd/ycBXQ9n5eLfG1hjOpX3XKmWuTy1EFRqS+ND8uB12gaaNRO6UU4yuQzUs+RUHdjcQJLoLbdsQWScHGI3c=" } 作为字符串类型传 怎么改?
最新发布
03-24
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值