题目内容
输入样例:
3
3 12
10 6
8 20
输出样例:
0
4
2
思路
利用整数分块
我们假设
n
n
n减小
x
x
x,我们设
l
=
n
−
x
l = n-x
l=n−x。
设
m
1
m_1
m1为
m
m
m变化后的值,可以知道
m
1
=
⌈
(
m
−
1
)
l
⌉
×
l
m_1 = \lceil \frac{(m-1)}{l} \rceil\times l
m1=⌈l(m−1)⌉×l
又有
⌈
(
m
−
1
)
l
⌉
=
⌊
(
m
−
1
)
l
⌋
+
1
\lceil \frac{(m-1)}{l} \rceil = \lfloor \frac{(m-1)}{l} \rfloor+1
⌈l(m−1)⌉=⌊l(m−1)⌋+1
所以
m
1
=
⌊
(
m
−
1
)
l
⌋
×
l
+
l
m_1 = \lfloor \frac{(m-1)}{l} \rfloor \times l+l
m1=⌊l(m−1)⌋×l+l
所以我们修改需要耗费的金额就为
c
o
s
t
=
n
−
l
+
⌊
(
m
−
1
)
l
⌋
×
l
+
l
−
m
cost = n-l+ \lfloor \frac{(m-1)}{l} \rfloor \times l+l-m
cost=n−l+⌊l(m−1)⌋×l+l−m
我们最终需要的是
c
o
s
t
cost
cost的最小值。
下面是代码:
#include<bits/stdc++.h>
#include<algorithm>
#define inf 1e9
#define ll long long
#define pii pair<int,int>
using namespace std;
const int N = 5e5+10;
int n, m, t, k, s;
void solve(){
cin>>n>>m;
if(m%n==0){
cout<<"0\n";
}
else if(n >= m){
cout<<n-m<<"\n";
}
else{
int res = n-m;
int ans = inf;
for(int l = 1, r;l <= n;l = r+1){//r为最后一个等于m/l的位置
r = (m-1)/((m-1)/l);
ans = min(ans, ((m-1)/l*l));
}
cout<<res+ans<<"\n";
}
}
int main(){
cin>>t;
while(t--)
solve();
return 0;
}
诸位ACMer共勉