题解:P16342 [科大国创杯初中组 2026] 倍数调整
Dr_KC_Haus
·
·
题解
设最终的 $a$ 和 $b$ 为 $a'$ 和 $b'$。
因为 $b$ 较小,所以 $b'$ 在 $1 \sim 2 \times b$ 之间。
那么对每个 $b'$,计算调整 $a$ 至其倍数的最小代价及调整 $b$ 的代价,取全局最小值即可。
:::success[Code]{open}
为了方便阅读,把 $b'$ 记为 $i$。
有一个解就是将 $b$ 变为 $1$,此时 $a$ 是 $1$ 的倍数,而这样做的代价就是 $b - 1$,但如果 $i > 2 \times b$,就说明 $|i - b| > b$ 这样就超过了最大代价。所以上文说 $b'$ 在 $1 \sim 2 \times b$ 之间。
定义一个数 $r = a \bmod i$。
那么可以将 $a$ 向上调到下一个倍数代价为 $i - r$。
向下调到下一个倍数,代价为 $r$。
```cpp
#include<bits/stdc++.h>
#define int long long
#define rest(i,n,m) for(int i=n;i<=m;i++)
#define rst(i,n,m) for(int i=n;i>=m;i--)
using namespace std;
int a,b;
signed main(void){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>a>>b;
if (b==1){
cout<<0<<endl;
exit(0);
}
int minn=b-1;
rest(i,1,2*b){
if(i>b and i-b>=minn) break;
int sum=abs(b-i);
if (sum>=minn) continue;
int r=a%i,k;
if(r==0) k=0;
else{
int u=i-r,d=1e18;//u 向上调
if(a-r>=1)d=r;//向下调
k=min(u,d);
}
int t=sum+k;
if (t<minn) minn=t;
}
cout<<minn<<endl;
exit(0);
}
```