专栏文章
题解:P11701 [ROIR 2025] 平方差
P11701题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqaag5o
- 此快照首次捕获于
- 2025/12/04 01:31 3 个月前
- 此快照最后确认于
- 2025/12/04 01:31 3 个月前
提供一种好想的 $O(\sqrt{d}) 做法
第一眼看到 ,还以为暴力就能直接过,于是写了个 枚举,毫无疑问地 TLE 了(悲)
于是我开始尝试推式子,并重点关注较小的
我们知道 可以转化为
又因为 、 均为正整数,且 (结合 ,实际上应为 )
所以 、 也应为正整数,且 更大
又因为 、 均为正整数,且 (结合 ,实际上应为 )
所以 、 也应为正整数,且 更大
回到本题,由于满足 ,因此同样满足 ,不妨记 、 ,则等式化为 ,结合上述内容( 、 为正整数),则可以通过枚举合法的 数对来尝试求解(假定 )
对于合法的 ,容易得到二元一次方程组
从而解得 、
结合 、 都是正整数的限制,该方程组要么无解、要么有一对解,是否无解取决于 是否是 的倍数。
从而解得 、
结合 、 都是正整数的限制,该方程组要么无解、要么有一对解,是否无解取决于 是否是 的倍数。
那么本题就做完了,枚举 的因子对 ,随后验证是否有解即可(别忘了 和 的范围)
代码很短,码风很丑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 条评论,欢迎与作者交流。
正在加载评论...