[题解][2021浙江CCPC] Fair Distribution

题目描述

给定两个数n,m,每次操作可以让n-1或者m+1,求使m%n==0的最少操作数量。

题解
设进行n-t次操作,使n变成t。
若m%t不为0,此时的操作数量为:n-t+t-m%t。
若m%t==0,操作数量为n-t。

那么只需要枚举t就可以解决此题。
但会发现t的范围从1-n过大,考虑将t的范围限制在1-sqrt(m),
且每次分别考虑将n变成t及将n变成m/t(上取整)的情况。
套用上述公式即可求解。

代码

//
// Created by ZWZWW on 2024/4/24.
//
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        int t=1;
        int ans=10000000009;
        if(n>=m) {
            cout << (n-m) << endl;
            continue;
        }
        if(m%n==0) {
            cout << 0 << endl;
            continue;
        }
        while(1){
            if(m%t){
                if(n>=t)ans=min(ans,n-(m%t));
                if(n>=(m+t-1)/t)ans=min(ans,n-(m%((m+t-1)/t)));
            }
            else{
                if(n>=t)ans=min(ans,n-t);
                if(n>=m/t)ans=min(ans,n-(m/t));
            }
            t++;
            if(t>sqrt(m)+1)break;
        }
        cout<<ans<<endl;
    }
}
posted @ 2024-04-25 23:08  ZWZWW  阅读(24)  评论(0)    收藏  举报