【数论】HDU 4143 A Simple Problem
2024-08-30 20:15:47
题目内容
给出一个正整数\(n\),找到最小的正整数\(x\),使之能找到一个整数\(y\),满足\(y^2=n+x^2\)。
输入格式
第一行是数据组数\(T\),每组数据有一个整数\(n\)。
输出格式
输出\(T\)行,表示\(x\),若找不到答案输出\(-1\)。
数据范围
\(0\le n\le 10^9\)
样例
2
2
3
样例输出
-1
1
思路
A Not Simple Problem
原式变形一下:
\(n=(y+x)(y-x)\)
因此找到\(n\)的两个因子,设为\(a_1=y+x\),\(a_2=y-x\)。
此时\(a_1-a_2=2x\),找到差最小值即可。
需要满足的条件:
\(x\)是正数 \(\Rightarrow a_1>a_2\)
\(x\)是整数 \(\Rightarrow (a_1-a_2)\%2=0\)
\(y\)是整数 \(\Rightarrow (a_1+a_2)\%2=0\)
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int ans=0x3f3f3f3f;
bool flag=false;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0&&(i+n/i)%2==0&&(n/i-i)%2==0&&i!=n/i&&(n/i-i)>0){
flag=true;
if(n/i-i<ans)ans=n/i-i;
}
}
if(flag)printf("%d\n",ans/2);
else printf("-1\n");
}
return 0;
}
最新文章
- 第4天--linux内核学习
- 在ROS下编写自己的节点来订阅话题(C++)
- C# MailMessage Attachment 中文名附件发邮件-Firefox中文显示正常,网页打开邮件附件中文名乱码
- Ajax的实现
- Eclipse 中的重构功能
- params关键字
- DOJO 如何清空表单
- 【Sqlserver】修改数据库表中的数据:对缺失的数据根据已有的数据进行修补
- java_jdbc_3层 解耦
- 读书笔记-----Java并发编程实战(一)线程安全性
- Jeffrey Richter&#39;s Power Threading Library
- Visual Studio 自定义项目模板
- 前端的UI设计与交互之字体篇
- YouTube上最火的十个大数据视频
- 原生的js轮播图
- 关于oracle中varchar2与nvarchar2的一点认识
- Simple2D-21(重构)渲染部分
- Buffer Pool--锁定内存页
- 线性SVM的推导
- DICOM中的入门概念