HDU 2092整数解【水題】【数学】

1837 ワード

せいすうかい
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22482    Accepted Submission(s): 7816
Problem Descriptionには2つの整数があります.それらを合わせるとある整数に等しく、掛けると別の整数に等しくなります.それらは本当なのか偽なのか、つまりこのような整数が存在しないのか、本当に分からないので、素早く答えることができますか.プログラミングしかできないようです.例えば、x+y=9、x*y=15?このような整数xとy 1+4=5、1*4=4が見つからないので、加算は5に等しく、乗算は4に等しい2つの整数は1と4 7+(-8)=-1、7*(-8)=-56であるため、加算は-1に等しく、乗算は-56に等しい2つの整数は7と-8である  Input入力データは、ペアで出現する整数n,m(−1000qianneng
整数xとyの和とxとyの積をあげて、この2つの式を満たすことができるかどうか
の整数xと整数yを返します.出力Yesが見つかります.そうでなければ出力No
構想:x+y=n,x*y=mとし,n,mが既知であり,第2の式を第1の式に代入する.
x+m/x=n、すなわちx^2+m=n*x、すなわちx^2-n*x+m=0.1つの要素に変換
二次方程式は、一元二次方程式に整数解があるかどうかを判断する.実数解があるか否かを先に判断する必要がある.
すなわち、b^2-4*a*cが0以上であるかどうか.さらに(-b±√4*a*c)/(2*a)が整数であるか否かを判断する.
タイトルのb^2-4*a*cはn*n-4*mです.num=n*n-4*mとします.すると(-b±√4*a*c)/(2*a)
= (n±√num)/2.
numが0以上であるか否かを判断し、(n±√num)/2が整数であるか否かを判断する必要がある.
(n±√num)/2は2つの条件を満たす:
①( int)√num*(int)√num=numの場合√numは整数
②(n±√num)%2=0の場合(n±√num)/2は整数
#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m) && (m||n))
    {

        int num = n*n-4*m;
        if(num >= 0 && (int)sqrt(num*1.0)*(int)sqrt(num*1.0) == num && (int)(n + sqrt(num*1.0))%2==0 && (int)(n - sqrt(num*1.0)) %2==0)
            printf("Yes
"); else printf("No
"); } return 0; }