[题解][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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】