题解 | 最大公约数和最小-NOIP2001普及组复赛B题

B-最大公约数和最小公倍数问题_NOIP2001普及组复赛

https://ac.nowcoder.com/acm/contest/229/B

题目描述

输入二个正整数,求出满足下列条件的P,Q的个数
条件:  1.P,A是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.

输入描述:

2个正整数

输出描述:

1个数,表示求出满足条件的P,Q的个数

示例1

输入
3 60
输出
4

解答

首先当然是分解质因数了——
map<int,int>xys,yys;//<底数,指数>
for(int i=2;i<=sqrt(x);i++){
    while(x%i==0){
        x/=i;
        xys[i]++;
    }
}
if(x!=1)xys[x]++;
for(int i=2;i<=sqrt(y);i++){
    while(y%i==0){
        y/=i;
        yys[i]++;
    }
}
if(y!=1)yys[y]++;

下面开始看质因数了

要是的某个因数的指数比的还大,肯定不可能,直接为0;

要是的某个因数的指数比的小,代表两个数这个因数指数分别为的这个因数的指数和的这个因数的指数——这个因数的指数有两种情况;

要是的某个因数的指数与的相等,代表两个数这个因数指数均为的这个因数的指数,一种情况。

以样例为例:

3:

底数 指数
3 1

60:

底数 指数
2 1
3 1
5 1

底数为2,1>0,答案(乘法原理)

底数为3,1=1,答案不变

底数为5,1>0,答案

答案为4

但是!假如有y0指数为0但x0指数非零的数,会判断漏!!!例如:3 5

于是我一开始就
if(y%x){
    cout<<0;
    return 0;
}
下面是完整源码:
#include<bits/stdc++.h>
using namespace std;
int main(){
    int x,y,ans=1;
    cin>>x>>y;
    if(y%x){//最大公约数一定是最小公倍数的约数
        cout<<0;
        return 0;
    }
    map<int,int>xys,yys;//<底数,指数>
    //分解x0
    for(int i=2;i<=sqrt(x);i++){
        while(x%i==0){
            x/=i;
            xys[i]++;
        }
    }
    if(x!=1)xys[x]++;
    //分解y0
    for(int i=2;i<=sqrt(y);i++){
        while(y%i==0){
            y/=i;
            yys[i]++;
        }
    }
    if(y!=1)yys[y]++;
    for(map<int,int>::iterator i=yys.begin();i!=yys.end();++i){
        if(xys[i->first]>i->second)ans=0;//这句其实可以不要
        if(xys[i->first]<i->second)ans*=2;
    }
    cout<<ans;
    return 0;
}



来源:破壁人五号
全部评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务