题目链接:https://codeforces.com/gym/103055/problem/F
题面:
给你一个n表示有多少机器人,m表示有多少能量棒。机器人每次只能减少,能量棒每次只能增加,消耗1金。问最少消耗多少钱让 m%n==0;
思路:
(m-1) / i * i 用整数分块求最小值
AC代码:
/**
* @Author: WarBlood 584299804@qq.com
* @Create: 2021/5/20 20:26
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define DEBUG(x) cout<<x<<"\n"
const int maxn=105;
const int Mod=1e9+7;
const int inf=0x3f3f3f3f;
int t;
ll n,m;
int main(){
ios::sync_with_stdio(false);
while(cin>>t){
while(t--){
cin>>n>>m;
if(n>=m){
DEBUG(n-m);
}else if(m%n==0){
DEBUG(0);
}else{
ll ans=inf;
int j;
for(int i=1;i<=n;i++){
j=min(n,(m-1)/((m-1)/i));
ans=min(ans,(m-1)/i*i);
i=j;
}
DEBUG(n-m+ans);
}
}
}
return 0;
}