hdu 5615 Jam's math problem

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(1T100)  cases 

Each case has one line,the line has  3  numbers  a,b,c(1a,b,c100000000)
 

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
 

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值