题解:AT_arc150_b [ARC150B] Make Divisible
[ARC150B] Make Divisible解题报告
前言
这题非常好,窝被根号分治骗进来,写了数论分块而去,感觉题解区大家思路多少都有点不同。我写的数论题很少,看不懂大佬的过程,只能手推了,下面是蒟蒻的过程。
思路
先看
然后自然有柿子
然后很自然就是用
然后感性理解一波,
因为此时
那么完整柿子:
发现向上取整可以整数分块,怎么搞?感性理解下面柿子:
分块时某一段的左端点一定是一段里面最优的。
代码
在实现上出了点锅,在
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int t;
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>t;
while(t--){
ll a,b;
cin>>a>>b;
if(a>=b){cout<<a-b<<"\n";continue;}//b不足就补齐
ll ans=1e18,r;
for(ll l=a;l<=b-1;l=r+1){
r=min(b-1,(b-1)/((b-1)/l));
ans=min(ans,(l-a)+(1+(b-1)/l)*l-b);
}r++;
ans=min(ans,(r-a)+(1+(b-1)/r)*r-b);
cout<<ans<<"\n";
}
return 0;
}