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; }
相关文章推荐
- js的几种继承方式
- 准确率 召回率 调和平均数等
- IOS开发之申请测试证书的步骤
- 网易2016年研发工程师编程题(2)
- 【BZOJ 2733】【HNOI 2012】永无乡 Splay启发式合并
- 目前流行的源程序版本管理软件和项目管理软件
- 从零开始构建自己的ARM Ubuntu系统
- 并查集
- POJ1182 食物链
- hud 1372 Knight Moves【bfs】
- (4.5.3.4)finished with non-zero exit value 2
- Source Insight 的基本使用之查看 Android Source
- HDU 1402 A * B Problem Plus(FFT)
- link和import的区别
- mount -o nolock
- 使用 ContentProviderOperation 来提升性能
- hadoop集群扩展
- C++程序设计(关于函数中数组传递的一点心得)
- office2016与visio2016不能“并存”的问题分析
- MySQL快速入门