专栏文章
sqrt(n²+n+X)题解
AT_abc420_g题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio5bvl5
- 此快照首次捕获于
- 2025/12/02 13:37 3 个月前
- 此快照最后确认于
- 2025/12/02 13:37 3 个月前
题目大意
输入一个数 ,求出所有 使得 为正整数。
解题思路
令 。
则 。
将等式两边同时乘以 ,得 。
接着配方,得 。
即 。
通过平方差公式,得 。
令 :
的值可通过遍历获得, 。
解题代码
由于,所以只需要遍历
for(int a=1;a<=C_sqrt;i++),其中 C_sqrt 。考虑 的正负性,我们
insert(a,b)和insert(-b,-a) 其中 。实例代码使用
CPPset处理重复数字:#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()。
完结撒花!
完结撒花!
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...