CF1916B Two Divisors 题解

Link\text{Link}

题意

给出 xx 的次大和最大因子 aabb(这里规定因子不能等于 xx 本身),求 xx。保证有解。

分析

显然最大的因子是又 xx 去掉一个最小的质因子 pp 得到的,次小因此可能由 xx 去掉一个次小的质因子 qq,也可能是 bb 又去掉了一个因子 pp 得到的。

所以 b=xp,a=xqb=\frac{x}{p},a=\frac{x}{q}b=xp,a=xp2b=\frac{x}{p},a=\frac{x}{p^2}

第一种情况中, bb 相对 aa 没有 pp 这个因子,所以 bb 不是 aa 的倍数。他们缺失的因子都是对方有的,所以 xx 为他们的最小公倍数。

第二种情况中, bbaa 的倍数。直接求出因子 pp,那么 x=bp=b2ax=bp=\frac{b^2}{a}

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
    long long x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
//const int N=;
int t,n; 
ll a,b;
ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
int main(){
	t=read();
	while(t--){
		a=read();b=read();
		ll c=gcd(a,b);
		if(b%a==0) cout<<b*(b/a)<<endl;
		else cout<<c*(b/c)*(a/c)<<endl;
	}
    return 0;
}
posted @ 2023-12-31 08:25  luckydrawbox  阅读(8)  评论(0)    收藏  举报  来源