传送门:戳我
题目大意:给定一个n,求最小的x,使得x满足y^2=n+x^2
思路:由于这个n是10^9,直接枚举x,y肯定是要跪的,所以考虑其他办法。
首先将方程变形:y^2-x^2=n ---> (y-x)(y+x)=n,然后枚举y-x,时间复杂度就在可以接受的范围内了
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
int ans=0x7f7f7f7f;
for(int i=1;i*i<n;i++){
if (n%i!=0) continue;
int tmp=n/i;
if( ((tmp+i)&1)==0 && ((tmp-i)&1)==0 ){
int x=(tmp-i)/2;
if(x<ans)
ans=x;
}
}
if(ans<0x7f7f7f7f)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}