您的位置:首页 > 其它

hdu 5615 Jam's math problem

2016-03-16 19:50 357 查看


Jam's math problem

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

Total Submission(s): 881    Accepted Submission(s): 423


Problem Description

Jam has a math problem. He just learned factorization.

He is trying to factorize ax2+bx+c into
the form of pqx2+(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.

 

Input

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)

 

Output

You should output the "YES" or "NO".

 

Sample Input

2
1 6 5
1 6 4

 

Sample Output

YES
NO

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

 

Source

BestCoder Round #70

 

Recommend

hujie   |   We have carefully selected several similar problems for you:  5644 5643 5642 5641 5640 

/*
题目大意:
判断是否可以把  ax^2 + bx + c 转化成 pqx^2 + (qk + mp)x + km = (px+k)(qx+m)
由题目条件可得:p,q,k,m>0   a,b,c>0   那么函数的开口向上,对称轴在负半轴
所以可以讨论 b^2 - 4ac 大于等于0还是小于0的情况了
注意p,q,k,m不能为无理数   所以sqrt( b^2 -4ac )必须为整数

什么叫因式分解:
把一个多项式在一个范围(如有理数范围内分解,即所有项均为有理数)化为几个最简整式的积的形式。
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int  main()
{
__int64 sum,a,b,c;//
__int64 t;//

__int64 k;

scanf("%I64d",&t);//
while(t--)//
{
scanf("%I64d%I64d%I64d",&a,&b,&c);
sum=b*b-4*a*c;

if(sum<0)
printf("NO\n");
else if(sum>=0)
{
k=sqrt(sum);
if( (k*k)==sum )
{
printf("YES\n");
}
else
printf("NO\n");
}
}
return 0;
}


下面这个是方法二: 枚举的方法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int a,b,c;
int p[22000],k[22000];
int cntp,cntk;
int q,m;

void init()
{
int i,j;
cntp=0;
cntk=0;
for(i=1;i<=(int)(sqrt(a));i++)
{
if(a%i==0)
{
p[++cntp]=i;
//p[++cntp]=a/i; 这步可以省略,可以举个例子来分析下,比如a=12 , c=6  ,可以证明出p[] 和 k[] 可以省略一个
//这样可以节省点时间
}
}
for(j=1;j<=(int)(sqrt(c));j++)
{
if(c%j==0)
{
k[++cntk]=j;
k[++cntk]=c/j;
}
}
return ;
}

void get_answer()
{
int i,j;
for(i=1;i<=cntp;i++)
{
for(j=1;j<=cntk;j++)
{
q=a/p[i];
m=c/k[j];
if(q*k[j]+m*p[i]==b)
{
printf("YES\n");
return ;
}
}
}

printf("NO\n");
return ;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&c);
init();
get_answer();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: