0%

ARC150B

数论分块

Make Divisible

题目链接:https://atcoder.jp/contests/arc150/tasks/arc150_b

题意:给出A,B求出X,Y,满足$(A+X)|(B+Y)$,且最小化$X+Y$,其中$A,B \in (1,1e9)$

分析:设比值$k=(B+Y)/(A+X)$,则有

则可以得到X的限制

一个更好的形式

这样,我们可以枚举k来计算答案.

由数论分块可知,最多有$\sqrt B$个有效的k.于是不断地跳k,就可以在复杂度为根号的时间内解决问题.

1
2
3
4
5
6
7
ll k=1,ans=A+B;
while(k<B){
ll x=max(0ll,(B-1)/k-A+1);
ans=min(ans,(k+1)*x+k*A-B);
ll r=(B-1)/((B-1)/k);
k=r+1;
}