题意 : 就是给你一个数n,让你输出能够满足y^2 = n +x^2这个等式的最小的x值。
思路 : 这个题大一的时候做过,但是不会,后来学长给讲了,然后昨天比赛的时候二师兄看了之后就敲了,我也想了一会儿才想起来,真是惭愧啊。。。。。
其实就是将上边那个式子变一下:(y-x)*(y+x) = n ,然后接下来就去枚举(y-x)的值,因为手算了几组数据,发现当这个值越靠近√n时,x的值越小,其实看这个等式也可以看出来,所以枚举的时候从√n这里开始往下枚举就行,然后再看(y-x)+(y+x) = 2*y ,所以你枚举出这个(y-x)的值再用n除以(y-x)得到一个数,这两个数加起来得是2的倍数。
1 //4143 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <math.h> 6 7 using namespace std; 8 9 10 int main() 11 { 12 int T ,n; 13 scanf("%d",&T) ; 14 while(T--) 15 { 16 scanf("%d",&n) ; 17 int temp = sqrt(n) ,i; 18 for(i = temp ; i >= 1 ; i--) 19 { 20 if(n % i == 0 && n/i != i && (n/i+i) % 2 == 0) 21 { 22 printf("%d ",(n/i+i)/2-i) ; 23 break ; 24 } 25 } 26 if(i == 0) printf("-1 ") ; 27 } 28 return 0; 29 }