专栏文章
题解:AT_abc420_g [ABC420G] sqrt(n²+n+X)
AT_abc420_g题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio57pyw
- 此快照首次捕获于
- 2025/12/02 13:33 3 个月前
- 此快照最后确认于
- 2025/12/02 13:33 3 个月前
题意
题意很简单,就是给你一个正整数 ,你要找出所有的正整数 ,使得 是一个正整数。
。
思路
要使得 是一个正整数,那么 一定可以表示成某个数的平方。
我们想办法把 给拆成一个平方差在求解。
很明显, 可以用平方差公式来分解。
到这里,这道题就做完了。
两个乘数我们只要枚举其中一个即可,只要枚举到的是 的因子,那么我们就可以算出另一个乘数。
然后,我们计算出可能的值,加入到答案中,再去个重就好了。
代码
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 << " ";
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...