[题解] ARC125B Squares
题意
给定整数 \(n\),求 \((x,y)\) 使得:
- \(1\leq x,y\leq n\)。
- \(x^2-y\) 是一个平方数。
思路
令 \(x^2-y=k^2\),\(k\leq0\)。
得到 \(x^2-k^2=(x+k)(x-k)=y\)。
令 \(p=x+k\),\(q=x-k\),则:
- \(x=\frac{p+q}{2}\),则 \(p\equiv q\mod 2\),\(1\leq \frac{p+q}{2}\leq n\)
- \(y=pq\),则 \(p=\frac yq\)。
- \(q\leq p\),则 \(p\geq\frac nq\)。
枚举 \(q\),得到 \(p\) 的范围 \(\frac nq\leq p\leq q\) ,由于 \(q\) 一定不会超过 \(\sqrt n\)(\(q\leq p=\frac nq\)),所以在 \(O(\sqrt n)\) 内解决。
Code
#include <cstdio>
#define int long long
const int MOD = 998244353;
int n, ans;
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n / i; i++)
ans = (ans + (n / i - i + 2) / 2) % MOD;
printf("%lld", ans);
return 0;
}