HDU 2092(水題-數學問題)

整數解

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(b
b-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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章