Two Divisors

本文介绍了解决题目GoodBye2023B.TwoDivisors的方法,通过分析因数关系和质因数分解,分两种情况确定x的值,最后提供了C++代码实现。
摘要由CSDN通过智能技术生成

Good Bye 2023
B. Two Divisors
题目链接

题意:

给你x的最大的两个因数a,b,保证 1 ≤ a < b < x 1\le a \lt b \lt x 1a<b<x ,问x是什么。

思路:

如果a b是x的次大和最大因数,那么显然x/a x/b就是x次小和最小因子,假如说分别记为m n。那么如果把x分解质因数,那么易知n应该是最小的质因数,m是次小的质因数或者最小质因数的平方(如果存在两个及以上),两者取其小。

分类讨论一下,如果m是次小的质因数,那么nm互质,a对x来说缺少一个n,b对x来说缺少一个m,所以a含有b不含的m,同理b含有a不含有的n。所以其实 a = g c d ( a , b ) ∗ m a=gcd(a,b)\ast m a=gcd(a,b)m b = g c d ( a , b ) ∗ n b=gcd(a,b)\ast n b=gcd(a,b)n,因此就能得出 x = l c m ( a , b ) x=lcm(a,b) x=lcm(a,b)

如果m是最小质因数平方,因为n是最小质因数,也就是 m = n 2 m=n^2 m=n2 ,这时a b是倍数关系, g c d ( a , b ) = a , l c m ( a , b ) = b gcd(a,b)=a,lcm(a,b)=b gcd(a,b)=a,lcm(a,b)=b,由 x = a ∗ m = b ∗ n = l c m ∗ n x=a\ast m=b\ast n=lcm\ast n x=am=bn=lcmn可知,需要再在lcm的基础上再乘一个n,也就是b/a。

为啥第二种情况还要给lcm再乘一个b/a呢,这是因为 m = n 2 m=n^2 m=n2,m是n的倍数,在第一种情况中 l c m ( a , b ) = b ∗ a / g c d lcm(a,b)=b\ast a/gcd lcm(a,b)=ba/gcd a / g c d a/gcd a/gcd给出了b所缺少的那个质因数,而第二种情况由于nm是倍数关系,b有n这个质因数了,导致gcd多了一个n,a除以gcd(a,b)后没能给出那个n,所以需要特判一下额外补偿。

code:

#include <iostream>
#include <cstdio>
using namespace std;
 
int gcd(int x,int y){
	while(y)y^=x^=y^=x%=y;
	return x;
}
int T,a,b;
 
int main(){
	cin>>T;
	while(T--){
		cin>>a>>b;
		int d=gcd(a,b);
		int x=a/d,y=b/d;
		if(x==1)cout<<b*y<<endl;
		else cout<<b*x<<endl;
	}
	return 0;
}
  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值