经过简单的分析之后,我们可以发现,对于x,我们要求的就是一组n,m满足n^2-(n/m)^2=x。
有两种求法。
第一种:
观察n的极限范围是多少,我们发现,对于相同的n,m越大,该式值就越大,x的范围是1e9,为了得到n最大是多少,我们尽可能的减小m的值,我们发现m=1时式子没有什么意义,特判即可,当m=2时,我们发现左边为3/4*n^2,也就是说n的范围是sqrt(x)级别的,枚举n判断是否存在m即可。
第二种:
原式可以化为(n-(n/m))*(n+(n/m))=x
(n-(n/m))<(n+(n/m)),所以(n-(n/m))是sqrt级别的,枚举即可。
只写了第二种的代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int t; 4 int main() 5 { 6 scanf("%d",&t); 7 while(t--){ 8 int x; 9 scanf("%d",&x); 10 if(!x){ 11 printf("1 1\n"); 12 continue; 13 } 14 int i; 15 for(i=1;i*i<=x;i++){ 16 if(x%i)continue; 17 int u=i,v=x/i; 18 if((u+v)%2)continue; 19 int n=(u+v)/2,m=(v-u)/2; 20 if(!m)continue; 21 m=n/m; 22 if(n*n-(n/m)*(n/m)==x){ 23 printf("%d %d\n",n,m); 24 break; 25 } 26 } 27 if(i*i>x)printf("-1\n"); 28 } 29 return 0; 30 }