首页 > 其他分享 >GDCPC2023 J X Equals Y

GDCPC2023 J X Equals Y

时间:2023-10-04 09:02:56浏览次数:38  
标签:lfloor vc frac GDCPC2023 ll Equals rfloor right

洛谷传送门

Gym 传送门

当时在 GDCPC 现场是这题首杀。20min 就会了,但是 2h 才有电脑写(


观察到至多 \(50\) 组数据满足 \(\max(x, y) > 10^6\),考虑一些根号做法。

当 \(f(x, a)\) 的长度 \(\ge 3\) 时,\(a \le \sqrt{x}\),因此可以暴力做,先找出所有 \(f(x, a)\),再找出所有 \(f(y, b)\),套个 map 找相等。

当 \(f(x, a)\) 的长度 \(= 1\) 时,\(x = y\),可以直接判掉。

当 \(f(x, a)\) 的长度 \(= 2\) 时,我们有:

  • \(\left\lfloor\frac{x}{a}\right\rfloor = \left\lfloor\frac{y}{b}\right\rfloor\)
  • \(x \bmod a = y \bmod b\)

后者等价于 \(x - a \left\lfloor\frac{x}{a}\right\rfloor = y - b \left\lfloor\frac{y}{b}\right\rfloor\)。设 \(t = \left\lfloor\frac{x}{a}\right\rfloor = \left\lfloor\frac{y}{b}\right\rfloor\),那么有 \(x - at = y - bt\),化简得 \(b - a = \frac{y - x}{t}\)。

整除分块套个 map 找到所有 \(\left\lfloor\frac{x}{a}\right\rfloor\) 和 \(\left\lfloor\frac{y}{b}\right\rfloor\) 相等的区间,设当 \(a \in [l_1, r_1], b \in [l_2, r_2]\) 时,\(t = \left\lfloor\frac{x}{a}\right\rfloor = \left\lfloor\frac{y}{b}\right\rfloor\)。那么我们有 \(b - a = \frac{y - x}{t}\)。显然 \(b - a \in [l_2 - r_1, l_1 - r_2]\),若这个满足就可以构造一组解了。

注意构造完解后要判断是否满足 \(a > \sqrt{x} \land b > \sqrt{y}\),还有别忘了 \(a, b\) 分别有 \(A, B\) 的上界。

时间复杂度 \(O(\sum \sqrt{\max(x, y)} \log \max(x, y))\)。

code
// Problem: J. X Equals Y
// Contest: Codeforces - The 2023 Guangdong Provincial Collegiate Programming Contest
// URL: https://codeforces.com/gym/104369/problem/J
// Memory Limit: 1024 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

ll X, Y, A, B;

inline ll mysqrt(ll x) {
	for (ll i = max((ll)sqrt(x) - 2, 0LL);; ++i) {
		if (i * i > x) {
			return i - 1;
		}
	}
}

void solve() {
	scanf("%lld%lld%lld%lld", &X, &Y, &A, &B);
	if (X == Y) {
		puts("YES\n2 2");
		return;
	}
	ll sx = mysqrt(X), sy = mysqrt(Y);
	map<ll, pii> M;
	for (ll i = 2, j; i <= X && i <= A; i = j + 1) {
		j = X / (X / i);
		M[X / i] = mkp(i, min(j, A));
	}
	for (ll i = 2, j; i <= Y && i <= B; i = j + 1) {
		j = Y / (Y / i);
		if (M.find(Y / i) == M.end()) {
			continue;
		}
		ll t = Y / i;
		ll l1 = M[t].fst, r1 = M[t].scd, l2 = i, r2 = min(j, B);
		if ((Y - X) % t) {
			continue;
		}
		ll d = (Y - X) / t;
		if (l2 - r1 <= d && d <= r2 - l1) {
			ll a = l1;
			ll b = a + d;
			if (b < l2) {
				ll p = l2 - b;
				a += p;
				b += p;
			}
			if (a > sx && b > sy) {
				printf("YES\n%lld %lld\n", a, b);
				return;
			}
		}
	}
	map< vector<ll>, ll > mp;
	for (ll a = 2; a <= A && a <= sx; ++a) {
		vector<ll> vc;
		ll x = X;
		while (x) {
			vc.pb(x % a);
			x /= a;
		}
		reverse(vc.begin(), vc.end());
		mp[vc] = a;
	}
	for (ll a = 2; a <= B && a <= sy; ++a) {
		vector<ll> vc;
		ll x = Y;
		while (x) {
			vc.pb(x % a);
			x /= a;
		}
		reverse(vc.begin(), vc.end());
		if (mp.find(vc) != mp.end()) {
			printf("YES\n%lld %lld\n", mp[vc], a);
			return;
		}
	}
	puts("NO");
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:lfloor,vc,frac,GDCPC2023,ll,Equals,rfloor,right
From: https://www.cnblogs.com/zltzlt-blog/p/17741903.html

相关文章

  • GDCPC2023 B , D , F , K 题解
    和队友一起打的2023年广东省大学生程序设计竞赛重现赛,写了B,D,K,胡了一个F。D题目大意随着广东的建设与发展,越来越多人选择来到广东开始新生活。在一片新建的小区,有\(n\)个人要搬进\(m\)栋排成一行的房子,房子的编号从\(1\)到\(m\)(含两端)。房子\(u\)和\(v\)相邻......
  • 重写equals方法是否需要重写hashcode方法的总结
    面试时经常会被问的一个问题:重写equals方法时是否需要重写hashCode方法,反过来又是怎样?这篇文章将对这个问题进行了一个总结和梳理一、考察的知识点首先需要明确下这个问题到底在考察我们的什么知识点,涉及到equals方法和hashCode方法的问题其实都是在考察把某个类的对象作......
  • Java String类的 equals、==和intern()
    Java实例的生成我们都知道,java中new一个类的实例是在JVM的堆中完成的,如下图所示:在这里我们以String类为例讲解一些更为细节的东西!String生成实例的代码如下:String str=new String("hello");对于通过new产生一个字符串(假设为” hello”)时,会先去上图的常量池中查找是否已经有了......
  • ==与equals的区别
    Integeri= 42;Longl=42l;Doubled= 42.0;下面为true的是A(i==l)B(i==d)C(l==d)Di.equals(d)Ed.equals(l)Fi.equals(l)Gl.equals(42L)答案是G1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱......
  • 说说hashCode() 和 equals() 之间的关系?
    每天一道面试题,陪你突击金九银十!上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于“hashCode()和equals()之间的关系?”的面试题,本篇来解析一下这道基础面试题。先祭一张图,可以思考一下为什么?介绍equals()的作用是用来判断两个对象......
  • 【C#】【Equals和ReferenceEquals】关于对象和值的问题
    在学习C#中的记录类型时,对出现的Equals和ReferenceEquals得到的不同结果表示不理解,随即进行相关资料查找。 值类型==:比较两者的“内容”是否相同,即“值”是否一样Equals:比较两者的“内容”是否相同,即“值”是否一样ReferenceEquals:返回false,因为会对值类型进行装箱再进行......
  • java == 和 equals 和 128以下整数
    Integera=127;Integerb=127;System.out.println(a==b);打印值为true而Integera=128;Integerb=128;System.out.println(a==b);打印值为false 因为:在Java中,不应该以这种方式比较对象。当您像a==b那样比较它们时,您比较的是引用,而不是值,值......
  • ==和equals的区别
     ==:既可以判断基本类型,又可以判断引用类型。==:如果判断基本类型,判断的是值是否相等。==:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一对象。equals:是object类中的方法,只能判断引用类型。默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。(具体可查......
  • Java基础——==和equals的区别
     ==:既可以判断基本类型,又可以判断引用类型。==:如果判断基本类型,判断的是值是否相等。==:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一对象。equals:是object类中的方法,只能判断引用类型。默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。(具体可查......
  • 重载和重写的区别,equals与==的区别
    一、重载和重写的区别1.1重写(Override)从字面上看重写就是重新写一遍,其实就是子类继承父类并把父类中的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)......