P1029 最大公约数和最小公倍数问题(数论水题)

题目描述

输入两个正整数 x0,y0x_0, y_0x0,y0,求出满足下列条件的 P,QP, QP,Q 的个数:

  1. P,QP,QP,Q 是正整数。

  2. 要求 P,QP, QP,Q 以 x0x_0x0 为最大公约数,以 y0y_0y0 为最小公倍数。

试求:满足条件的所有可能的 P,QP, QP,Q 的个数。

输入格式

一行两个正整数 x0,y0x_0, y_0x0,y0

输出格式

一行一个数,表示求出满足条件的 P,QP, QP,Q 的个数。

输入输出样例

输入 #1
3 60
输出 #1
4
众所周知,a*b=gcd(a,b)*lcm(a,b),现在能确定a和b的范围以及a*b的值,直接枚举a,看看每个a能否找到一个对应的b。平方要处理一下。
如果没有的话记得要输出0。
#include <bits/stdc++.h>
using namespace std;
long long x,y;
long long gcd(long long a,long long b)
{
    return b? gcd(b,a%b):a;
}
bool vis[100005]={0};
long long lcm(int a,int b)
{
    return a*b/gcd(a,b);
}
int main()
{
    cin>>x>>y;
    long long i,j;
    long long z=x*y;
    long long ans=0;
    for(i=x;i<=y;i++)//i是a 
    {
        if(z%i==0)
        {
            if(gcd(i,z/i)==x&&lcm(i,z/i)==y)
            {
                if(i==z/i)
                {
                    cout<<ans*2+1;
                    return 0;
                }
                if(vis[i])
                {
                    cout<<ans*2;
                    return 0;
                }
                else
                {
                    ans++;
                    vis[i]=vis[z/i]=1;
                }
            }
        }
    }
    if(ans==0)cout<<0;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lipoicyclic/p/12421933.html