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

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)x2+6x+5=(x+1)(x+5)
就好像形如 ax^2+bx+cax2+bx+c => pqx^2+(qk+mp)x+km=(px+k)(qx+m)pqx2+(qk+mp)x+km=(px+k)(qx+m)
但是他很蠢,他只会做p,q,m,kp,q,m,k为正整数的题目
请你帮助他,问可不可以分解
输入描述
第一行TT,表示T(1 \leq T \leq 100 )T(1T100)组数据。
接下来TT组数据:
每组数据一行,一个三个整数a,b,ca,b,c,一组数据一行 (1 \leq a,b,c \leq 100000000)(1a,b,c100000000)
输出描述
对于每组数据,输出"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)=x2+6x+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;
}


你可能感兴趣的:(hdu5615 Jam's math problem (BestCoder Round #70))