2013年10月28日 星期一

[ZJ] a810. 2013高雄市能力競賽高中組 1. 倍數關係


#include<stdio.h>
#include<algorithm>
using namespace std;
#define cnt(a,b) (a/b)
long long int gcd(long long int a,long long int b){
    if(a%b==0) return b;
    return gcd(b,a%b);
}
long long int lcm(long long int a,long long int b){
    long long int A=0,n,B=0;
    if(a==b) return a;
    n=a;
    while(n){
        A++;
        n/=10;
    }
    n=b;
    while(n){
        B++;
        n/=10;
    }
    if(A+B>=18) return 1000000000000000001LL;
    return a*b/gcd(a,b);
}
int main(){
    long long int n,m,x,y,add,A,B;
    scanf("%lld%lld%lld%lld",&n,&m,&x,&y);
    if(x<0) x*=-1;
    if(y<0) y*=-1;
    if(x==0 && y==0){
        add=0;
        if(n<=0 && m>=0) add++;
        printf("%lld\n",add);
        return 0;
    }
    if(!x && y) x=y;
    if(x && !y) y=x;
    if(n<=0 && m<=0) n*=-1,m*=-1;
    if(n>m) swap(n,m);
    if(n>=0){
        A=m/x+m/y-m/(lcm(x,y));
        B=n/x+n/y-n/(lcm(x,y));
        if(n%x==0 || n%y==0) A++;
        if(m==0) A=1;
        printf("%lld\n",A-B);
    }
    if(n<0){
        n*=-1;
        A=m/x+m/y-m/(lcm(x,y));
        B=n/x+n/y-n/(lcm(x,y));
        printf("%lld\n",A+B+1);
    }
}

沒有留言:

張貼留言