sqrt(n²+n+X)题解

· · 题解

题目传送门

题目大意

输入一个数 X ,求出所有 n 使得 \sqrt{n^{2}+n+X} 为正整数。

解题思路

k=\sqrt{n^{2}+n+X}

k^{2}=n^{2}+n+X

将等式两边同时乘以 4 ,得 4n^{2}+4n+1+4X-1=4k^{2}

接着配方,得 (2n+1)^{2}+(4X-1)=(2k)^2

(2k)^2-(2n-1)^{2}=4X-1

通过平方差公式,得 (2k-2n-1)\times(2k+2n+1)=4X-1

a=2k-2n-1\;\;b=2k+2n+1

$\frac{1}{4}(\pm(b-a)-2)\begin{cases}\frac{1}{4}(b-a-2)=\frac{1}{4}(4n)=n_{1}\\\frac{1}{4}(a-b-2)=\frac{1}{4}(4n)=n_{2}\end{cases} --- #### 解题代码 由于$a\times b=C$,所以只需要遍历`for(int a=1;a<=C_sqrt;i++)`,其中 `C_sqrt` $=\sqrt{C}$ 。 考虑 $a,b$ 的正负性,我们`insert(a,b)`和`insert(-b,-a)` 其中 $a\le b$。 实例代码使用`set`处理重复数字: ```cpp #include<bits/stdc++.h> using namespace std; typedef long long ll; set<ll>solutions; void func(ll a,ll b) { if(a>b) swap(a,b); if((a+b)%4==0) { ll n1=(b-a-2)/4; ll n2=(a-b-2)/4; solutions.insert(n1); solutions.insert(n2); } } int main() { ll X; cin>>X; ll C=4*X-1; if(C==0) return 0; ll sqrt_C=sqrt(abs(C)); for(ll i=1;i<=sqrt_C;i++) { if(C%i==0) { ll b=C/i; func(i,b); func(-b,-i); } } cout<<solutions.size()<<endl; for(ll q:solutions) cout<<q<<" "; return 0; } ``` 该程序时间复杂度约为 $O(\sqrt{4X-1})$。 完结撒花!