[题解][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 @   ZWZWW  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示