您的位置:首页 > 其它

HDU 4143--卡时间

2015-05-31 19:36 232 查看
题意:给定n,求能找到y使 y^2 = n + x^2 成立的最小的x

分析:把n拆成两个数的乘积 n = a*b,则 y = (b+a)/2 ,x = (b-a)/2。暴力枚举a,b找到满足(b+a)%2==0,(b-a)%2==0,且(b-a)>0的最小值即可。不过会超时,所以适当处理一下:由于x必须大于零,所以枚举的b必须大于a,而且要满足 | b-a | 最小(因为求最小值),所以从sqrt(n)枚举到1就可以了。

代码:

#include<iostream>
#include<cmath>
using namespace std;
int n,t,ans;
int main()
{
cin>>t;
while(t--){
ans=-1;
cin>>n;
int tmp=sqrt(n);
for(int i=tmp;i>=1;i--){
if(n%i==0){
int j=n/i;
if((i+j)%2==0&&(j-i)>0&&(j-i)%2==0){
ans=(j-i)/2;break;
}
}
}
cout<<ans<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: