专栏文章
题解:AT_abc420_g [ABC420G] sqrt(n²+n+X)
AT_abc420_g题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mio5heby
- 此快照首次捕获于
- 2025/12/02 13:41 3 个月前
- 此快照最后确认于
- 2025/12/02 13:41 3 个月前
AT_abc420_g [ABC420G] sqrt(n²+n+X) 题解
解题思路
设 的值为 (其中 ),那么题目的条件可以写成一个方程:
将等式两边同乘 得:
配方得:
将左边用平方差展开得:
令 。由于 和 都是整数,所以 和 也必须是整数。这说明 和 必须是 的一对整数因子。
将定义 和 的两个式子相减得:
相加得:
解得:
为了让 都是整数, 和 都必须是 的倍数。
因为 ,是奇数,所以只要保证 是 的倍数, 就是 的倍数。
综上,我们需要枚举 的每一对因子,检查他们的和能否被 整除,然后算出所有 ,去重后输出。
时间复杂度 。
参考代码
CPP#include<iostream>
#include<set>
#define int long long
using namespace std;
int x;
set<int> ans;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>x;
int d=4*x-1,p=abs(d);
for(int i=1;i*i<=p;i++){
if(p%i==0){
int j=p/i;
if(d>0){
if((i+j)%4==0){
ans.insert((j-i-2)/4);
ans.insert((i-j-2)/4);
}
}
else{
if((j-i)%4==0){
ans.insert((j+i-2)/4);
ans.insert((-i-j-2)/4);
}
}
}
}
cout<<ans.size()<<'\n';
for(int i:ans) cout<<i<<' ';
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...