CUIT-ACM 2017-01-14 新生训练赛I题菜鸟见解

题意给两个数a,b,叫你求是否存在这样x,y两个数使得满足x+y=a,LCM(x,y)=b;然后就简单了,解两个方程就是了。坑面在于尽量用long long(不过好像这道题用int 也能过),还有就是开△(delta)=b^2-4ac根号时,要保证开出来是个整数(因为会自动取整)就要用到一些小技巧,具体请看代码,如果不能保证是整数则会WA的。(我就是没想到这点,找了好久).

#include
#include

int gcd(int x,int y){
    return y==0?x:gcd(y,x%y);
}

int main()
{   long long a,b,x,y,s;
    while(scanf("%lld %lld",&a,&b)!=EOF){
        b*=gcd(a,b);
        s=sqrt(a*a-4*b);
        y=(a+s)/2;
        x=a-y;
        if(s>=0 && s*s==a*a-4*b )//最大的坑点就是要看判别式△(delta)=b^2-4ac是否看出来还是整数,如果不是整数就不行,因为它会自动取整.
            printf("%lld %lld\n",x,y);//怎样判断的方法就是s*s==a*a-4*b.
        else
            printf("No Solution\n");
    }
}

你可能感兴趣的:(CUIT-ACM 2017-01-14 新生训练赛I题菜鸟见解)