题目描述
给定两个数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;
}
}
标签:m%,Fair,min,int,题解,CCPC,ans,操作
From: https://www.cnblogs.com/zwzww/p/18158887