题解:P16342 [科大国创杯初中组 2026] 倍数调整

· · 题解

设最终的 $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); } ```