Jam's math problem
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
Jam有道数学题想向你请教一下,他刚刚学会因式分解比如说,x2+6x+5=(x+1)(x+5) 就好像形如 ax2+bx+c => pqx2+(qk+mp)x+km=(px+k)(qx+m) 但是他很蠢,他只会做p,q,m,k为正整数的题目 请你帮助他,问可不可以分解
输入描述
第一行T,表示T(1≤T≤100)组数据。 接下来T组数据: 每组数据一行,一个三个整数a,b,c,一组数据一行 (1≤a,b,c≤100000000)
输出描述
对于每组数据,输出"YES"或者"NO".
输入样例
2 1 6 5 1 6 4
输出样例
YES NO
Hint
第一组数据可以分成(x+1)(x+5)=x2+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"); else printf("NO\n"); } return 0; }