专栏文章

题解:P11701 [ROIR 2025] 平方差

P11701题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@miqaag5o
此快照首次捕获于
2025/12/04 01:31
3 个月前
此快照最后确认于
2025/12/04 01:31
3 个月前
查看原文

提供一种好想的 $O(\sqrt{d}) 做法

第一眼看到 1lr10181\le l \le r \le 10^{18}还以为暴力就能直接过,于是写了个 O(r)O(\sqrt{r}) 枚举,毫无疑问地 TLE 了(悲)
于是我开始尝试推式子,并重点关注较小的 dd

我们知道 x2y2x^2-y^2 可以转化为 (x+y)(xy)(x+y)(x-y)
又因为 xxyy 均为正整数,且 xyx \ge y (结合 d1d \ge 1 ,实际上应为 x>yx>y )
所以 x+yx+yxyx-y 也应为正整数,且 x+yx+y 更大
回到本题,由于满足 x2y2=dx^2-y^2=d ,因此同样满足 (x+y)(xy)=d(x+y)(x-y)=d ,不妨记 i=x+yi=x+yj=xyj=x-y ,则等式化为 ij=dij=d ,结合上述内容( iijj 为正整数),则可以通过枚举合法的 (i,j)(i,j) 数对来尝试求解(假定 i<ji<j
对于合法的 (i,j)(i,j) ,容易得到二元一次方程组
{x+y=jxy=i\begin{cases} x+y=j\\ x-y=i \end{cases}
从而解得 x=(i+j)/2x=(i+j)/2y=xiy=x-i
结合 xxyy 都是正整数的限制,该方程组要么无解、要么有一对解,是否无解取决于 i+ji+j 是否是 22 的倍数。
那么本题就做完了,枚举 dd 的因子对 (i,j)(i,j) ,随后验证是否有解即可(别忘了 xxyy 的范围)

代码很短,码风很丑QwQ
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,r,d,ans;
signed main()
{
	cin>>d>>l>>r;
	for(int i=1;i<=sqrt(d);i++)  //枚举d较小的因子i
	{
		if(d%i) continue;  //i不是d的因子
		int j=d/i;  //d较大的因子j
		if(i+j&1) continue;  //i+j不是2的倍数
		int x=i+j>>1;  //计算x
		if(x*x<l||x*x>r) continue;  //x不在范围内
		int y=x-i;  //计算y
		if(y*y<l||y*y>r) continue;  //y不在范围内
		ans++;  //排除所有错误后,计算答案
	}
	cout<<ans;
}

评论

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

正在加载评论...