您的位置:首页 > 其它

hdu5615 Jam's math problem (BestCoder Round #70)

2016-02-02 09:49 330 查看

Jam's math problem

 Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others)问题描述
Jam有道数学题想向你请教一下,他刚刚学会因式分解比如说,x^2+6x+5=(x+1)(x+5)x​2​​+6x+5=(x+1)(x+5)
就好像形如 ax^2+bx+cax​2​​+bx+c => pqx^2+(qk+mp)x+km=(px+k)(qx+m)pqx​2​​+(qk+mp)x+km=(px+k)(qx+m)
但是他很蠢,他只会做p,q,m,kp,q,m,k为正整数的题目
请你帮助他,问可不可以分解
输入描述
第一行TT,表示T(1 \leq T \leq 100 )T(1≤T≤100)组数据。
接下来TT组数据:
每组数据一行,一个三个整数a,b,ca,b,c,一组数据一行 (1 \leq a,b,c \leq 100000000)(1≤a,b,c≤100000000)
输出描述
对于每组数据,输出"YES"或者"NO".
输入样例
2
1 6 5
1 6 4
输出样例
YES
NO
Hint
第一组数据可以分成(x+1)(x+5)=x^2+6*x+5(x+1)(x+5)=x​2​​+6∗x+5
分析:根据十字相乘法,可以知道如果a可以拆分为x1,x2,c可以拆分为y1,y2,
且x1*y1+x2*y2==b或者x1*y1+x2*y1==b,那么便是符合要求的,否则不符合
时间复杂度:根号a*c的因子数,可以优化到a的因子数*b的因子数
#include<bits/stdc++.h>using namespace std;struct node{int x,y;}line[110000];int main(){int a,b,c,_;scanf("%d",&_);while(_--){scanf("%d%d%d",&a,&b,&c);int flag=0,cnt=0;for(int i=1;i<=sqrt(c)+1;i++){if(c%i==0){line[cnt].x=i;line[cnt++].y=c/i;}}for(int i=1;i<=sqrt(a)+1;i++){if(a%i==0){int x1=i,x2=a/i;for(int j=0;j<cnt;j++){if(x1*line[j].x+x2*line[j].y==b||(x1*line[j].y+x2*line[j].x==b)){flag=1;break;}}}if(flag==1)break;}if(flag==1)printf("YES\n");elseprintf("NO\n");}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: