题解:P10869 [HBCPC2024] LCMs
题解代码没有分讨?我来交一发!
本场比赛最难的签到题。
题意:将整数
先讨论两种简单的情况。
如果
否则如果
否则如果
若走一步,代价
否则因为
设
只剩下
如果走一步,代价
如果走多步,因为互质的两数的最小公倍数是它们的乘积,为了使代价尽量小,我们可以选择途经
若途经的数
整理一下最终情况。设
以上代价取最小值即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int lcm(int a,int b){
return a/__gcd(a,b)*b;
}
int mnp(int a){
for(int i=2; i*i<=a; i++) if(!(a%i)) return i;
return a;
}
signed main(){
int t;cin>>t;
while(t--){
int a,b;cin>>a>>b;
if(a==b){
cout<<0<<"\n";
continue;
}
if(!(b%a)){
cout<<b<<"\n";
continue;
}
if(__gcd(a,b)!=1){
cout<<a+b<<"\n";
continue;
}
int p=mnp(a),q=mnp(b);
int a2=lcm(a,2),b2=lcm(2,b),p2=lcm(2,p),q2=lcm(2,q);
cout<<min({a*b,a+p*b,a*q+b,a2+b2,a+p2+b2,a2+q2+b,a+p*q+qb,a+p2+q2+b})<<"\n";
}
return 0;
}
写晕了/yun,如果哪里有问题欢迎在评论区指出。