The 18th Zhejiang Provincial Collegiate Programming——F. Fair Distribution

题目地址:https://codeforces.com/gym/103055/problem/F

题目内容

在这里插入图片描述
输入样例:

3
3 12
10 6
8 20

输出样例:

0
4
2
思路

利用整数分块
我们假设 n n n减小 x x x,我们设 l = n − x l = n-x l=nx
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(m1)×l
又有 ⌈ ( m − 1 ) l ⌉ = ⌊ ( m − 1 ) l ⌋ + 1 \lceil \frac{(m-1)}{l} \rceil = \lfloor \frac{(m-1)}{l} \rfloor+1 l(m1)=l(m1)+1
所以 m 1 = ⌊ ( m − 1 ) l ⌋ × l + l m_1 = \lfloor \frac{(m-1)}{l} \rfloor \times l+l m1=l(m1)×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=nl+l(m1)×l+lm
我们最终需要的是 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共勉

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值