1 条题解
-
0
自动搬运
来自洛谷,原作者为

Vct14
**搬运于
2025-08-24 23:02:02,当前版本为作者最后更新于2024-08-11 22:03:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题解代码没有分讨?我来交一发!
本场比赛最难的签到题。
题意:将整数 变为整数 代价为 ,求将 变为 的最小代价。注意:只能变为大于 的整数。
先讨论两种简单的情况。
如果 ,则最小代价为 。不动即可。
否则如果 ,则一次变化最优,最小代价为 ,否则若变化多次,最后一步的代价一定大于或等于 。
否则如果 。
若走一步,代价 。
否则因为 ,第一步的代价一定大于或等于 ,最后一步的代价一定大于或等于 ,理论最小代价 ,要实现这个代价只能走两步。设途经的数为 ,第一步走需使得 ,第二步走需使得 。即 是 的公因数,可以走 实现。
设 。则 ,。由于 且 ,有 ,因此 ,即 。所以 。最小代价为 。
只剩下 的情况。这种情况我们是走不到 的。
如果走一步,代价 。
如果走多步,因为互质的两数的最小公倍数是它们的乘积,为了使代价尽量小,我们可以选择途经 和 的最小质因子 和 使乘积尽量小。
若途经的数 与起点 和终点 都互质,代价为 ,我们可以选择途经 使得代价最小。
整理一下最终情况。设 。
- ,代价 。
- ,代价 。
- ,代价 $\operatorname{lcm}(a,p)+\operatorname{lcm}(p,b)=a+pb$。
- ,代价 $\operatorname{lcm}(a,q)+\operatorname{lcm}(q,b)=aq+b$。
- ,代价 $\operatorname{lcm}(a,p)+\operatorname{lcm}(p,2)+\operatorname{lcm}(b,2)=a+\operatorname{lcm}(p,2)+\operatorname{lcm}(b,2)$。
- ,代价 $\operatorname{lcm}(a,2)+\operatorname{lcm}(q,2)+\operatorname{lcm}(q,b)=\operatorname{lcm}(a,2)+\operatorname{lcm}(q,2)+b$。
- ,代价 $\operatorname{lcm}(a,p)+\operatorname{lcm}(p,q)+\operatorname{lcm}(q,b)=a+pq+b$。
- ,代价 $\operatorname{lcm}(a,p)+\operatorname{lcm}(p,2)+\operatorname{lcm}(q,2)+\operatorname{lcm}(q,b)=a+\operatorname{lcm}(p,2)+\operatorname{lcm}(q,2)+b$。
以上代价取最小值即可。
#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,如果哪里有问题欢迎在评论区指出。
- 1
信息
- ID
- 10643
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者