题意:给定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;
}
}
本文介绍了一种求解形如y^2 = n + x^2的最小正整数x的方法。通过将n分解为两个因数的乘积,并利用枚举技巧来寻找符合条件的最小x值。
2485

被折叠的 条评论
为什么被折叠?



