Jam's math problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 861 Accepted Submission(s): 411
Problem Description
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.
He is trying to factorize ax
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)
Each case has one line,the line has 3
Output
You should output the "YES" or "NO".
Sample Input
2 1 6 5 1 6 4
Sample Output
YES NOHintThe first case turn $x^2+6*x+5$ into $(x+1)(x+5)$
Source
我记得以前应该是这么做的,找出二次项系数跟常数项个子所有因子,然后组合,看是否可以组合产生一次项系数,,,本来以为会超时的,但是水过了 - - ||
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10000+10],b[10000+10];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int A,B,C;
scanf("%d%d%d",&A,&B,&C);
int cnt1,cnt2;
cnt1=cnt2=0;
for(int i=1;i<=sqrt(A);i++)
if(A%i==0)
a[cnt1++]=i;
for(int i=1;i<=sqrt(C);i++)
if(C%i==0)
b[cnt2++]=i;
int f=false;
for(int i=0;i<cnt1;i++)
{
int p=a[i];
int q=A/a[i];
for(int j=0;j<cnt2;j++)
{
int k=b[j];
int m=C/b[j];
if(m*p+q*k==B)
{
f=true;
break;
}
if(p*k+q*m==B)
{
f=true;
break;
}
}
if(f) break;
}
if(f) printf("YES\n");
else printf("NO\n");
}
return 0;
}