[2001年NOIP普及组] 最大公约数和最小公倍数问题

p*q等于x0*y0。可以枚举到x0*y0中能被x0*y0整除的数,如果这个数与另一个这个数与它的积是x0*y0的数的最大公因数是x0或最小公倍数是y0,那这个数不是p就是q。每枚举出这样一个数,随之可以再确定一个数,所以只需要枚举到sqrt(x0*y0)。

#include<iostream>
#include<cmath>
long long gcd(long long x,long long y)
{
    if(x%y==0) return y;
    else return gcd(y,x%y);
}
int main()
{
    int x,y;
    std::cin>>x>>y;
    long long xy=x*y;
    long long qrxy=std::sqrt(xy);
    int cnt=0;
    for(long long i=2;i<=qrxy;i++)
    {
        if(xy%i==0&&gcd(i,xy/i)==x)
        {
            cnt+=2;
        }
    }
    std::cout<<cnt;
}

 

posted @ 2022-08-21 20:12  nichengmeibeiyong  阅读(33)  评论(0编辑  收藏  举报