HDU-4145 A Simple Problem 简单数论
2012-10-12 19:59
435 查看
这题给定一个N,求最小的x^2满足y^2 = x^2 + N;
将x^2移到左边,得到(y+x)*(y-x) = N,于是我们分解N成两个约数相乘的形式,于是我们从sqrt(N)到1开始枚举约数,得到可以相除的约数对(a, b)后,直接计算abs((a-b) / 2)就是x的值了,当然x不能为零,并且a,b的奇偶性要一致。
代码如下:
将x^2移到左边,得到(y+x)*(y-x) = N,于是我们分解N成两个约数相乘的形式,于是我们从sqrt(N)到1开始枚举约数,得到可以相除的约数对(a, b)后,直接计算abs((a-b) / 2)就是x的值了,当然x不能为零,并且a,b的奇偶性要一致。
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; int N; int main() { int T, ret; scanf("%d", &T); while (T--) { scanf("%d", &N); ret = -1; int LIM = (int)sqrt(double(N)); for (int i = LIM; i >= 1; --i) { if (N % i == 0) { if ((i & 1) ^ ((N/i) & 1)) { continue; } else if (i - N/i){ ret = abs((i - N/i) / 2); break; } } } printf("%d\n", ret); } return 0; }
相关文章推荐
- HDU - 5974 A Simple Math Problem(简单数论)
- HDU-5974 A Simple Math Problem(数论推导)
- HDU 4143 A Simple Problem(数论-水题)
- HDU - 5974 A Simple Math Problem(ICPC2016 大连现场,简单的数学推理)
- hdu 5974 A Simple Math Problem (数论思路)
- HDU 4143 A Simple Problem(数论-水题)
- hdu 5832 A water problem(简单数论)
- HDU 5974 A Simple Math Problem (数论+解方程组)
- hdu 5349 MZL's simple problem(简单的SET容器)
- ACM-ICPC Asia Regional Contest HDU 5974 A Simple Math Problem(数论)
- HDU 5974 A Simple Math Problem(数论)
- HDU5974 A Simple Math Problem---数论--转化解方程
- HDU 5974 A Simple Math Problem (数论,大连区域赛)
- HDU 5974 A Simple Math Problem(简单数学)
- [HDU](5974)A Simple Math Problem ---数论
- HDU 5974 A Simple Math Problem 数论 gcd
- hdu------(1757)A Simple Math Problem(简单矩阵快速幂)
- HDU 1757 A Simple Math Problem 简单矩阵快速幂
- 2014多校第十场1004 || HDU 4974 A simple water problem
- hdu 4974 A simple water problem(多校第十场 水题)