[题解] ARC125B Squares


题目链接

题意

给定整数 \(n\),求 \((x,y)\) 使得:

  1. \(1\leq x,y\leq n\)
  2. \(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\),则:

  1. \(x=\frac{p+q}{2}\),则 \(p\equiv q\mod 2\)\(1\leq \frac{p+q}{2}\leq n\)
  2. \(y=pq\),则 \(p=\frac yq\)
  3. \(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 
#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;
}

相关