专栏文章

AT_abc397_d

AT_abc397_d题解参与者 3已保存评论 4

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
4 条
当前快照
1 份
快照标识符
@mipwq4dg
此快照首次捕获于
2025/12/03 19:11
3 个月前
此快照最后确认于
2025/12/03 19:11
3 个月前
查看原文

题目大意

思路

直接枚举会超时,考虑把式子变形。下面是我的演算过程:
n10181x,y2106x3y3=n(xy)(x2+xy+y2)=N(xy)[(x+y)2xy]=N(xy)[(x+y)2(x+y)2(xy)24]=N令 x+y=a, xy=bb(a2a2b24)=Nb3a2+b24=Nb(3a2+b2)=4N\because n\le10^{18}\\ \therefore 1\le x,y\le2\cdot10^6\\ x^3-y^3=n\\ (x-y)\cdot (x^2+xy+y^2)=N\\ (x-y)\cdot [(x+y)^2-xy]=N\\ (x-y)\cdot [(x+y)^2-\frac{(x+y)^2-(x-y)^2}{4}]=N\\ 令\ x+y=a,\ x-y=b\\ \therefore b\cdot (a^2-\frac{a^2-b^2}{4})=N\\ b\cdot \frac{3a^2+b^2}{4}=N\\ b\cdot(3a^2+b^2)=4N
所以我们可以直接枚举 NN 的因数 bb,因为上述式子也可以变形为 3a2b+b3=4N3a^2b+b^3=4N,所以 b3<4Nb^3<4N。接下来,我们考虑是否有一个正整数 aa。可以根据式子算出 3a23a^2,然后看 a2\sqrt{a^2} 的值是否是一个正整数。
判断可以直接用 C++ 语言中的 sqrt 函数,注意需要 #include <cmath> 或者使用万能头文件。但是这个函数本质上是二分,带 log,虽然不影响通过本题,但是还是有些慢的。我曾经试过预处理,但是不行,因为把平方数打表打出来就已经超时了,所以还是用系统函数吧。

代码实现

已 AC,提交记录:Submission #63817473,其实跑得还是挺快的(6ms)。
CPP
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <unordered_map>
using namespace std;

long long n;

long long sqr(long long a)
{
	long long ret = sqrt(a);
	if (ret * ret != a)
		return -1;
	return ret;
}

int main()
{
	cin >> n; n *= 4;
	for (long long b = 1; b * b * b <= n; b++)
	{
		if (n % b != 0) continue;
		long long a = n / b - 1LL * b * b;
		if (a % 3) continue; a /= 3;
		a = sqr(a); if (a == -1) continue;
		if (a % 2 != b % 2) continue;
		long long x = (a + b) / 2;
		long long y = (a - b) / 2;
		if (x < 1 || y < 1) continue;
		cout << x << " " << y << endl;
		return 0;
	}
	cout << "-1" << endl;
	return 0;
}
如有更好的做法欢迎提出!本次 D 题推式子千万别推错了,不过样例也应该过不了,所以在发现出 bug 的时候检查一下式子。

评论

4 条评论,欢迎与作者交流。

正在加载评论...