HDU 4143 A Simple Problem(枚举)
2014-05-06 00:00
267 查看
题目链接
题意 : 就是给你一个数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的倍数。
View Code
题意 : 就是给你一个数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的倍数。
//4143 #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; int main() { int T ,n; scanf("%d",&T) ; while(T--) { scanf("%d",&n) ; int temp = sqrt(n) ,i; for(i = temp ; i >= 1 ; i--) { if(n % i == 0 && n/i != i && (n/i+i) % 2 == 0) { printf("%d\n",(n/i+i)/2-i) ; break ; } } if(i == 0) printf("-1\n") ; } return 0; }
View Code
相关文章推荐
- HDU 4143 A Simple Problem (枚举暴力)
- hdu 4143 A Simple Problem(数学)
- hdu 4143 A Simple Problem
- HDU 4143 A Simple Problem
- HDU 4143 A Simple Problem
- HDU 4143 A Simple Problem
- HDU 4143 A Simple Problem(数论-水题)
- hdu 4143 A Simple Problem
- HDU 4143 A Simple Problem
- HDU 4143 A Simple Problem(数论-水题)
- HDU-4143 A Simple Problem
- HDU 4143 A Simple Problem
- HDU_4978_A simple probability problem.(推导or精度枚举)
- hdu 4267 A Simple Problem with Integers
- HDU 4972 A simple dynamic programming problem(找规律)
- 【矩阵乘法】hdu hdoj 1757 A Simple Math Problem
- HDU 4267 A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers
- hdu 3483 A Very Simple Problem
- HDU 3651 A Simple Problem