题解:AT_abc420_g [ABC420G] sqrt(n²+n+X)

· · 题解

我膨胀了!我敢给 G 题写题解了!

题意

题意很简单,就是给你一个正整数 x,你要找出所有的正整数 n,使得 \sqrt{n ^ 2 + n + x} 是一个正整数。

## 思路 要使得 $\sqrt{n ^ 2 + n + x}$ 是一个正整数,那么 $n ^ 2 + n + x$ 一定可以表示成某个数的平方。 $$n ^ 2 + n + x = m ^ 2$$ 我们想办法把 $n ^ 2 + n$ 给拆成一个平方差在求解。 $$4n ^ 2 + 4n = 4m ^ 2 - 4x$$ $$(2n + 1) ^ 2 = 4m ^ 2 - 4x - 1$$ $$4m ^ 2 - (2n + 1) ^ 2 = 4x - 1$$ 很明显,$m ^ 2 - (2n + 1) ^ 2$ 可以用平方差公式来分解。 $$(2m - 2n - 1)(2m + 2n + 1) = 4x - 1$$ 到这里,这道题就做完了。 两个乘数我们只要枚举其中一个即可,只要枚举到的是 $4x - 1$ 的因子,那么我们就可以算出另一个乘数。 然后,我们计算出可能的值,加入到答案中,再去个重就好了。 ## 代码 ```cpp #include<bits/stdc++.h> #define int long long using namespace std; int x,y,z; set<int> ans; signed main(){ cin >> x,y = 4 * x - 1,z = abs(y); if (!y) return printf("0\n"),0; for (int i = 1;i * i <= z;i++) if (z % i == 0){ int a = i,b = y / i,c = b - a - 2; if (c % 4 == 0 && a % 2 == 1 && b % 2 == 1) ans.insert(c / 4); a = -i,b = -y / i,c = b - a - 2; if (c % 4 == 0 && a % 2 == 1 && b % 2 == 1) ans.insert(c / 4); a = z / i,b = y / (z / i),c = b - a - 2; if (c % 4 == 0 && abs(a % 2) == 1 && abs(b % 2) == 1) ans.insert(c / 4); a = -z / i,b = -y / (z / i),c = b - a - 2; if (c % 4 == 0 && abs(a % 2) == 1 && abs(b % 2) == 1) ans.insert(c / 4); } cout << ans.size() << endl; for (auto y : ans) cout << y << " "; } ```