您的位置:首页 > 其它

HDU 5615 Jam's math problem(十字相乘判定)

2016-03-29 18:44 204 查看

Jam's math problem

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 990 Accepted Submission(s): 474



[align=left]Problem Description[/align]
Jam has a math problem. He just learned factorization.

He is trying to factorize ax

2

+bx+c


into the form of pqx

2

+(qk+mp)x+km=(px+k)(qx+m)

.

He could only solve the problem in which p,q,m,k are positive numbers.

Please help him determine whether the expression could be factorized with p,q,m,k being postive.

[align=left]Input[/align]
The first line is a number
T

,
means there are T(1≤T≤100)


cases

Each case has one line,the line has 3


numbers a,b,c(1≤a,b,c≤100000000)


[align=left]Output[/align]
You should output the "YES" or "NO".

[align=left]Sample Input[/align]

2
1 6 5
1 6 4


[align=left]Sample Output[/align]

YES
NO

Hint
The first case turn $x^2+6*x+5$ into $(x+1)(x+5)$


[align=left]Source[/align]
BestCoder Round #70

/*
思路:题目意思是判定 ax2+bx+c能不能分解成 pqx2+(qk+mp)x+km=(px+k)(qx+m),
其中参数都是正整数  即十字相乘,
刚看到这个题目第一感觉就是把复杂度降下来,枚举p,k就行,两重循环,刚开始误以为p枚举
1到sqrt(a)就行 ,这样是错误的,因为p,q代表不同角色,可能是大小反过来,所以枚举的
时候i若能被a整除,则另一个p是a/i这样才对。

参考网上思路1:
为了降低复杂度,将2个循环先分开处理一下,将不能整除的先去掉,这样就行

参考网上思路2:
对于形如ax2+bx+c的多项式,在判定它能否使用十字分解法分解因式时,
可以使用Δ=b2-4ac进行判定。
当Δ为完全平方数时,可以在整数范围对该多项式进行十字相乘。
*/
/*解法1*/
/*
#include <iostream>
#include <math.h>
using namespace std;
const int N=2*10000+5;
int nump
,numk
;
int lenp,lenk;
int main()
{
int t,a,b,c,p,q,k,m;
int n1,n2;
cin>>t;
while(t--){
cin>>a>>b>>c;
n1=sqrt(a);
n2=sqrt(c);
bool ok=0;
lenp=0;
lenk=0;
for(p=1;p<=n1;p++){
if(a%p==0){
nump[lenp++]=p;
nump[lenp++]=a/p;
}
}
for(k=1;k<=n2;k++){
if(c%k==0){
numk[lenk++]=k;
numk[lenk++]=c/k;
}
}
for(int i=0;i<lenp;i++){
for(int j=0;j<lenk;j++){
p=nump[i];
k=numk[j];
q=a/nump[i];
m=c/numk[j];
if(q*k+m*p==b){
ok=1;
break;
}
}
if(ok)
break;
}

if(ok)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}*/

/*解法2*/
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
long long a,b,c;
int t;
cin>>t;
while(t--){
bool ok=0;
cin>>a>>b>>c;
long long tmp=sqrt(b*b-4*a*c);
if(tmp*tmp==b*b-4*a*c)
ok=1;
if(ok)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: