HDU 2092 韦达定理

来源:互联网 发布:淘宝配近视眼镜 编辑:程序博客网 时间:2024/06/09 20:02

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2092

题解:刚开始看见这个题,就是模拟,联想开灯问题很容易想到从乘法约数开始选数并且可以缩小范围(缩小的平方根的绝对值),按着这个思路我就写了一段代码,可惜wa了,想了好大会,才发现这种优化仅适合当M为正整数,对于负数,必须乖乖的从小到大遍历,比如给你数为 -13 -14,如果我还按照先前优化的思想,遍历时肯定从-3 到-1,这时我会漏掉 -14 1,这样会找不到2个数相加等于-13。自己还是太年轻了。

(半优化)代码:

#include<iostream>#include<algorithm>using namespace std;int main() {int n, m;while (cin >> n >> m && (n || m)) {int flag = 0,teminal;teminal = (m > 0 ? m: -m);int num = sqrt(teminal);if (m > 0) {                     //////仅仅对当m为正整数 ,做了些许优化int temp = -num;for (int i = temp;i <= num;i++) {if (i&&m%i == 0) {if (i + m / i == n) {flag = 1;break;}}}}else if(m < 0){for (int i = m;i <= -1;i++) {if (m%i == 0) {if (i + m / i == n) {flag = 1;break;}}}}if (flag||m==0)cout << "Yes" << endl;elsecout << "No" << endl;}}

牛逼方法:韦达定理。

设一元二次方程
  
中,两根x₁、x₂有如下关系:
韦达定理变种 x+y=n; x*y=m; 
假设x,y是一元二次方程的两解,则x+y=-b/a=n,x*y=c/a;
b^2-4ac等价于b^2/a^2-4c/a 即n*n-4*m
因为要找出是否存在2个整数,所以b^2-4ac>=0并且开平方根为整数。
代码如下:
#include <stdio.h>#include <math.h>int main() {    int n, m;    while (~scanf("%d %d",&n,&m) && (n || m)){        (int)sqrt(n * n - 4 * m) == sqrt(n * n - 4 * m) ? puts("Yes") : puts("No");////此处很巧妙,如果n*n-4*m<0,则等式前有整数,而等式后会输出-nan(ind)    }}




0 0
原创粉丝点击