Good Bye 2023
B. Two Divisors
题目链接
题意:
给你x的最大的两个因数a,b,保证 1 ≤ a < b < x 1\le a \lt b \lt x 1≤a<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=a∗m=b∗n=lcm∗n可知,需要再在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)=b∗a/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;
}