HDU 2092
有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
例如:
x + y = 9,x * y = 15 ? 找不到这样的整数x和y
1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4
7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8
9 15 5 4 1 -56 0 0
No Yes Yes
这个题算是利用数学的典型题目吧,一开始想的满脑子都是暴力与优化,后来直接发现用数学解法特别简单。
由于数据量是-10000到10000,所以暴力是可以的。遍历其积的因子从1到平方根,每一次判断其是否有解即可。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b && (a||b))
{
int bb = abs(b);
if(bb==0)
{
cout<<"Yes"<<endl;
continue;
}
int uper=sqrt(bb);
int yes=0;
for(int i=1;i<=uper;i++){
if(bb%i==0){
if(b>0){
if(i+bb/i==a || -i-bb/i==a)
{
yes=1;
break;
}
}
else
{
if(-i+bb/i==a || i-bb/i==a)
{
yes=1;
break;
}
}
}
}
if(yes)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
若是用数学稍微计算一下,设和为n,积为m,
a=n-b;
ab=m;
bn-b*b=m;
-b*b+nb-m=0
这就是一个关于b的二次方程。那么根据判别式不小于零就可以得到有解的结论了。
#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
int a,b;
while (cin>>a>>b && (a||b)){
int aa = a*a;
int bb = 4*b;
int cc = sqrt(aa-bb);
if(aa-bb>=0 && aa-bb == cc*cc)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}