Jam's math problem(思维)

Posted handsomecui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jam's math problem(思维)相关的知识,希望对你有一定的参考价值。

Jam‘s math problem
 

Description

Jam has a math problem. He just learned factorization.  He is trying to factorize 技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享 into the form of 技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享.  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 技术分享, means there are 技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享 cases 
Each case has one line,the line has 技术分享 numbers 技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享
 

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)$ 
         
 题解:
 乍一看数据那么大,推出了(q+m)(p+k)=a+b+c;想着只要a+b+c不是质数就好了,就傻傻的打了个3亿的质数表,差点把我电脑运行爆,弄到一半赶紧关了,肯定超时了,看了别人的才知道自己想复杂了,不用那么麻烦的,暴力下判断就好了;由于(px+k)*(qx+m)也可以表示成(qx+k)(px+m);所以b有两种情况pk+mq,pm+qk;这里要注意;
代码:
 
 
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<string>
using namespace std;
typedef long long LL;
/*
const int MAXN=1e5+100;
map<string,bool>mp;
char* tostring(LL x){
    char s[12];
    int tp=0;
    while(x){
        s[tp++]=x%10+‘0‘;
        x/=10;
    }
    s[tp]=‘\0‘;
    reverse(s,s+tp);
    return s;
}
void db(){
    mp.clear();
    for(int i=2;i<100000;i++){
        if(!mp[tostring(i)])
        for(LL j=(LL)i*i;j<=(LL)3000000000;j+=i){
            mp[tostring(j)]=true;
        }
    }
}
int main(){
    int T,a,b,c;
    scanf("%d",&T);
    db();
    while(T--){
        scanf("%d%d%d",&a,&b,&c);
        if(a+b+c<4){
            puts("NO");continue;
        }
        if(mp[tostring((LL)a+b+c)])puts("YES");
        else puts("NO");
    }
    return 0;
}
*/
int main(){
    LL a,b,c,p,q,m,k;
    int T;
    cin>>T;
    while(T--){
        cin>>a>>b>>c;
        bool ans=false;
        for(int p=1;p*p<=a;p++){
            if(a%p==0){
                q=a/p;
                for(int k=1;k*k<=c;k++){
                    if(c%k==0){
                        m=c/k;
                        if(q*k+m*p==b||p*k+m*q==b)ans=true;
                    }
                    if(ans)break;
                }
            }
            if(ans)break;
        }
        if(ans)puts("YES");
        else puts("NO");
    }
    return 0;
}

 

以上是关于Jam's math problem(思维)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 5615 Jam's math problem(十字相乘判定)

hdu 5618 Jam's problem again

hdu5618 Jam's problem again

HDU 5618 Jam's problem again

HDU 5618 Jam's problem again (cdq分治+BIT)

HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)