3045 Lcm与Gcd构造
题目
给出2个数a,b的 Gcd(最大公约数n) 和 Lcm(最小公倍数m) ,求所有符合条件的a,b中,a + b的最小值。
思路
g
c
d
(
a
,
b
)
=
n
,
l
c
m
(
a
,
b
)
=
m
gcd(a,b)=n,lcm(a,b)=m
gcd(a,b)=n,lcm(a,b)=m
a
=
n
p
,
b
=
n
q
(
p
,
q
互
质
)
a=np,b=nq(p,q互质)
a=np,b=nq(p,q互质)
l
c
m
(
a
,
b
)
=
n
p
q
=
m
lcm(a,b)=npq=m
lcm(a,b)=npq=m
a
+
b
=
n
(
p
+
q
)
转
为
求
p
+
q
最
小
值
a+b=n(p+q)转为求p+q最小值
a+b=n(p+q)转为求p+q最小值
即
一
直
p
q
=
m
/
n
,
p
和
q
互
质
,
求
p
+
q
最
小
值
即一直pq=m/n, p和q互质,求p+q最小值
即一直pq=m/n,p和q互质,求p+q最小值
10 2 5
20 4 5
最后卡了一会互质的,原本质因子分解一波然后TLE了后来想起来直接 L o g N LogN LogN求约数然后判互质就好了
代码
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
/*DATA & KEY
*/
int T;
LL gcd(LL a,LL b)
{
return b?gcd(b,a%b):a;
}
void solve(int T)
{
//NEW DATA CLEAN
//NOTE!!!
int n,m;
cin>>n>>m;
int c=m/n;
int ans=1e9+7;
for(int i=1;i<=c/i;i++)
if(c%i==0&&gcd(i,c/i)==1)
ans=min(ans,i+c/i);
cout<<n*ans<<endl;
}
int main()
{
scanf("%d",&T);
while(T--)solve(T);
return 0;
}