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; }
相关文章推荐
- 讲解Linux中常见文件类型
- Android 技术干货收集
- 【Spring】@PostConstruct实现Spring静态注入
- 架构设计:负载均衡层设计方案(4)——LVS原理
- julia文件合并排序.jl
- 【python】dict。字典
- 几个可用的类的分享
- 扩展实体类的使用
- iOS越狱原理详解
- ~$吐槽“奇葩求职者”极品求职让人伤不起
- 将博客搬至CSDN
- js测验(w3c)
- 虚幻引擎自带的创建插件的插件
- java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException
- 扣丁学堂笔记第15天文件管理与XML、JSON解析
- 虚幻引擎自带的创建插件的插件
- 1004. Counting Leaves (30)
- 网友疯狂吐槽奇葩面试经历
- Caffe bug fixing List
- iOS开发学习之 - 照片框架详解