AtCoder Petrozavodsk Contest 001 A

题目大意:

输入两个整数XY(1<=x,y<=1e9),输出一个整数Z(1<=Z<=1e18),保证ZX的倍数并且不是Y的倍数,如果没有满足条件的Z,则输出-1,否则输出Z

思路:

如果XY的倍数,则Z必定不存在,排除该情况之后,想到了最大公约数,设XY的最大公约数是g,把X分成两部分g*aY分成两部分g*bab的最大公约数为1,想要所得数即是X的倍数并且不是Y的倍数,则保证gcd(X,Z)==X&&gcd(Y,Z)!=Y,a*a*g是所求,gcd(a*a*g,a*g)=a*g=X,gcd(a*a*g,b*g)=g*gcd(a*a,b)=g*gcd(a,b)*gcd(a,b)=g,此处有一个问题,如果b=1,那么gcd(a*a*b,Y)==Y,但这种情况之前已经排除,b=1意味着XY的倍数,所以不予考虑。

#include
using namespace std;
typedef long long ll;
ll n,m;
ll gcd(ll x,ll y){
    if(x%y==0) return y;
    return gcd(y,x%y);
}
int main() {
    while(~scanf("%lld%lld",&n,&m)){
        if(n%m==0){
            printf("-1\n");
        }
        else {
            ll x=n/(gcd(n,m));
            printf("%lld\n",x*n);
 
        }
    }
 
    return 0;
}


你可能感兴趣的:(Atcoder)