题解:P11701 [ROIR 2025] 平方差
belif__kibo · · 题解
提供一种好想的 $O(\sqrt{d}) 做法
第一眼看到 还以为暴力就能直接过,于是写了个
于是我开始尝试推式子,并重点关注较小的
我们知道
又因为
所以
回到本题,由于满足
对于合法的
从而解得
结合
那么本题就做完了,枚举
代码很短,码风很丑QwQ
#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;
}