UVA 11889 - Benefit

本文探讨了如何解决一个特定的数学问题:已知A和C,寻找使得LCM(A,B)=C成立的最小B值。介绍了最大公约数与最小公倍数之间的关系,并通过枚举A的所有质因子来找出符合条件的B。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
题目链接

题目简析

题意

LCM(A,B)=C即A和B的最小公倍数是C,根据输入的A和C,若存在B则输出B的最小值,否则输出“NO SOLUTION”。

思路

最大公约数(gcd)
(1)

int gcd(int a,int b){
return a%b==0?b:gcd(b,a%b);
}

(2)

int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}

最大公约数(gcd)与最小公倍数(lcm)的关系
a×b=lcm(a,b)×gcd(a,b)
在本题中
A×B=C×gcd B=C×gcd÷A
gcd是A中质因子中的一个,枚举A中的所有质因子z,令B=C÷A×z,
满足A×B==C×gcd条件的B即为所求。

代码(参照学习博客
#include<stdio.h>
#include<math.h>
using namespace std;
long long gcd(long long a,long long b){//求a和b的最大公约数 
        return a%b==0?b:gcd(b,a%b);     
}
int main(){
    long long z[10000],zs,i,j;
    int n;
    scanf("%d",&n);
        while(n--){
            long long a,b,c;
            scanf("%lld%lld",&a,&c);
            if(c%a){//当c不是a的最小公倍数时 
                printf("NO SOLUTION\n");
                continue;
            }
            long long cc=c;
            c=c/a;
            long long x=(long long)sqrt(a);
            zs=0;
            for(i=1;i<=x;i++)//一个因数大于根号a,另一个必定小于根号a
                if(a%i==0)
                {
                    z[++zs]=i;//两个因数 
                    z[++zs]=a/i;
                }   
                long long Ans=-1;
                for(j=1;j<=zs;j++){
                    b=c*z[j];
                    if(a*b/gcd(a,b)==cc){
                        Ans=b;
                        break;
                    }
                }
                if(Ans==-1)
                    printf("NO SOLUTION\n");
                else 
                    printf("%d\n",Ans);
        }
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值