整數解
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 54800 Accepted Submission(s): 19029
Problem Description
有二個整數,它們加起來等於某個整數,乘起來又等於另一個整數,它們到底是真還是假,也就是這種整數到底存不存在,實在有點吃不準,你能快速回答嗎?看來只能通過編程。
例如:
x + y = 9,x * y = 15 ? 找不到這樣的整數x和y
1+4=5,14=4,所以,加起來等於5,乘起來等於4的二個整數爲1和4
7+(-8)=-1,7(-8)=-56,所以,加起來等於-1,乘起來等於-56的二個整數爲7和-8
Input
輸入數據爲成對出現的整數n,m(-10000<n,m<10000),它們分別表示整數的和與積,如果兩者都爲0,則輸入結束。
Output
只需要對於每個n和m,輸出“Yes”或者“No”,明確有還是沒有這種整數就行了。
Sample Input
9 15
5 4
1 -56
0 0
Sample Output
No
Yes
Yes
本題完全屬於數學問題,千萬不要用循環遍歷啊!!!
那太可怕啦!
題解說明:
1,x+y=m
2,xy=n;
那麼可以表示爲x(m-x)=n
即x^2 - mx +n =0
x1= (-b + sqrt(bb-4ac)/2
x2= (-b - sqrt(bb-4a*c)/2
首先b^2 - 4 a c >=0 mm-4n>=0
其次 sqrt開放必須是整數,不得有浮點數
最後 -b+sqrt(mm-4n)或-b - sqrt(mm-4n) 爲偶數(因爲分母是2,必須爲偶數才能整除0
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
while(scanf("%d %d",&m,&n)!=EOF&&(n||m))
{
long long t=m*m-4*n;//防止t過大,我是爲了安全着想
long long k=sqrt(t);
if(t>=0&&k*k==t&&((m+k)%2==0||(m-k)%2==0))//三個條件必須滿足
{
printf("Yes\n");
}
else
printf("No\n");
}
return 0;
}