杭电水题之4143

来源:互联网 发布:breed改mac 编辑:程序博客网 时间:2024/05/01 10:20

看到这题挺简单的,只不过数字比较大,很可能会超时10^9这个数字很大,下面给出一种想法就是分解因式,

由y^2=n+x^2可得到(y-x)(y+x)=n,我们设y-x=i,那么就有y+x=n/i,这样就有2*x=n/i-i-——>x=(n/i-i)/2;

因此我们就可以写代码了,我们知道求一个数n的因子是开方的所以不会超时,(n/i是大于i的),这时候就有

直接求出来就行了。。

#include<iostream>
using namespace std;
#include<cmath>
int main()
{
int n,m,i,j,x;
cin>>n;
while(n--)
{    
j=0;
cin>>m;
for(i=(int)sqrt((double)m);i>=1;i--)
if(m%i==0&&(i!=m/i)&&(m/i-i)%2==0)

       //这里的i!=n/i主要是防止n刚好可以开方(比如4 ,9)

后面一个就是因为一个数n可以写成很多种a*b的形式,但是并不似每一种都满足条件,
{
j=1;
x=(m/i-i)/2;
break;
}
if(j==1)
cout<<x<<endl;
else cout<<"-1"<<endl;
}
return  0;



原创粉丝点击