Example
input
3
3 12
10 6
8 20
Output
0
4
2
题意: T组数据,每组数据输入n, m 。每组数据有两种操作,一种是n - 1,另一种是m + 1。 问最少操作次数实现 m % n == 0。
思路:
再次强调要用([(m - 1) / (n - x)] + 1) * (n - x),否则有关m 的 操作会出现负值(省赛训练的时候因为这个wa了好几发)。
再详细的看代码注释。
有关整除块找了一篇比较好的博客
上代码
#include<bits/stdc++.h>
using namespace std;
long long T, n, m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> T;
while(T--){
cin >> n >> m;
if(m % n == 0){ //如果一开始就能整除那就直接输出0;
cout << 0 << '\n';
}
else if(n >= m){ //如果机器人比能量棒还多,那只要能量棒增加到与机器人数量相等即可
cout << n - m << '\n';
}
else{
long long ans = 0x3f3f3f3f3f3f3f3f;//整除分块
for(long long l = 1, r; l <= n; l = r + 1){
r = (m - 1) / ((m - 1) / l); // 求整除块又区间边界
ans = min(ans, n - m + (m - 1) / l * l); // 根据公式可得 :要找区间块最左边的点使得在该区间内ans值取最小
}
cout << ans << '\n';
}
}
}
/*
r = (m - 1) / ((m - 1) / l);
举例解释一下改行代码
例如 200 / 45 = 4;
要是200 / a = 4满足时
a 的值最大为200 / (200 / 45) = 50;
a = 50 就是整除区间块的右边界。
*/