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

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

题目描述:输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件:
1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.

他还良心的解释了一下样例

输入:x0=3   y0=60
输出:4
说明(不用输出)此时的P  Q分别为:
3 60
15 12
12 15
60 3
所以:满足条件的所有可能的两个正整数的个数共4种.

这道题确实做了很久,这道题暴力可以过,但是也可以用数学方法,利用唯一分解定律,最大公约数的次数都是取min,最小公倍数的次数都是取max,如果次数不同,证明这一位的贡献值是2,两个数一个取max,一个取min,就好了,如果次数相等,就没有贡献。在处理前先判断一下最大公约数能不能整除最小公倍数.看了讲解视频,我稍微修改了一下代码,终于是过了。代码如下:

#include<bits/stdc++.h>
using namespace std;
int m,n,num,ans;
int gys(int a,int b)
{
    if(a%b==0) return b;
    else return gys(b,a%b);
}
int main()
{
    cin>>m>>n;
    num=m*n;
    if(m==n) ans--;
    for(int i=1;i<=sqrt(num);i++)
    {
        if(num%i==0&&gys(i,num/i)==m) ans+=2;
    }
    cout<<ans;
    return 0;
}

 

posted @ 2022-08-21 20:20  为么要取名字  阅读(44)  评论(0编辑  收藏  举报