[题解] ARC125B Squares

题目链接

题意

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

  1. (1leq x,yleq n)
  2. (x^2-y) 是一个平方数。

思路

(x^2-y=k^2)(kleq0)

得到 (x^2-k^2=(x+k)(x-k)=y)

(p=x+k)(q=x-k),则:

  1. (x=frac{p+q}{2}),则 (pequiv qmod 2)(1leq frac{p+q}{2}leq n)
  2. (y=pq),则 (p=frac yq)
  3. (qleq p),则 (pgeqfrac nq)

枚举 (q),得到 (p) 的范围 (frac nqleq pleq q) ,由于 (q) 一定不会超过 (sqrt n)(qleq 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;
}
原文地址:https://www.cnblogs.com/C202202chenkelin/p/15177551.html