Jam's math problem

问题描述
Jam有道数学题想向你请教一下,他刚刚学会因式分解比如说,x2+6x+5=(x+1)(x+5)x^2+6x+5=(x+1)(x+5)x
​2
​​ +6x+5=(x+1)(x+5)
就好像形如 ax2+bx+cax^2+bx+cax
​2
​​ +bx+c => pqx2+(qk+mp)x+km=(px+k)(qx+m)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,kp,q,m,k为正整数的题目
请你帮助他,问可不可以分解
输入描述
第一行TTT,表示T(1≤T≤100)T(1 \leq T \leq 100 )T(1≤T≤100)组数据。
接下来TTT组数据:
每组数据一行,一个三个整数a,b,ca,b,ca,b,c,一组数据一行 (1≤a,b,c≤100000000)(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)=x2+6∗x+5(x+1)(x+5)=x^2+6*x+5(x+1)(x+5)=x
​2
​​ +6∗x+5

官方题解:
Jam’s math problem
第一道题比较简单,可以说是简单的模拟题,我们考虑到a,b,ca,b,ca,b,c都是10910^{9}10
​9
​​ 的,所以我们决定要把时间复杂度降下来,对于每一个数,因为考虑到都是正数,所以我们处理起来就方便很多,打个比方32=2∗1632=2*1632=2∗16,那么枚举到222的时候就可以得出161616 ,轻松解决这道题

这道题不知道为什么我想了这么久还是想不出来 当时可能人傻了把

#include<cstdio>
#include<cmath>

const double eps=0.00000001;
inline int max(int aa,int bb){
    return aa>bb?aa:bb;
}
int main()
{
    int a1,b1 ,c1,T,temp;
    scanf("%d",&T);
    while(T--){//最后是用这种方法AC的 ——
        bool ans=false;
        scanf("%d%d%d",&a1,&b1,&c1);
        double a=(double)a1;
        double b=(double)b1;
        double c=(double)c1;
        double s=sqrt((b*b)*1.0-(4.0*a*c));
        double n1=((-1.0*b)+s)/(2.0);
        double n2=((-1.0*b)-s)/(2.0);
        if((fabs(n1-(int)n1)<=eps)&&(fabs(n2-(int)n2)<=eps))
            ans=true;
        else ans=false;
/** 这是我当时只想这枚举 p q k m 真的脑残了 // for(int p=1;p<=max(1,(a>>1));p++){///n/2 // for(int q=1;;q++){ // if((q*p)==a){ // for(int k=1;k<=c;k++){ // for(int m=1;;m++){ // temp=-1; // if((k*m)==c){ // temp=(q*k+m*p); // if(temp==b){ // ans=true; // goto loop; // } // } // else if((k*m)>c||(temp>b))break; // // } // } // } // else if((p*q)>a)break; // } // } // loop: */
            if(ans)puts("YES");
            else puts("NO");
    }
    return 0;
}

你可能感兴趣的:(Jam's math problem)