#include<bits/stdc++.h>\nusing namespace std;
typedef long long ll;
const ll mn=1e6+10;
const ll inf=2e18;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll x1,y1,d;
d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/by1;
return d;
}
void solve(){
ll x=0,y=0;
ll a,b,c;
cin>>a>>b>>c;
if(c%__gcd(a,b)!=0) cout<<-1<<'\n';
else{
ll d=exgcd(a,b,x,y);
ll ans=inf;
ll t=b/d;
a/=d;
b/=d;
c/=d;
x=(x
c%b+b)%b;
//cout<<x<<' '<<y<<'\n';
for(int k=-8;k<=8;k++){
ll xx=x+kt;
ll yy=(c-a
xx)/b;
if(xx>=0&&yy>=0) ans=min(ans,2*(xx+yy));
else ans=min(ans,2*abs(xx-yy)-1);
}
//cout<<x1<<' '<<y1<<'\n';
cout<<ans<<'\n';
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt;
cin>>tt;
while(tt--){
solve();
}
}这段代码通过枚举 k 值,计算出 x 和 y 的值,然后根据 x 和 y 的值计算出步数。具体步骤如下:\

  1. 确定最小解的 x 值:通过 x = (x*c%b + b) % b 计算出最小解的 x 值。\
  2. 枚举 k 的值:枚举 k 从 -8 到 8 的值,计算出 xx 和 yy 的值。\
  3. 计算步数:根据 xx 和 yy 的值,计算步数。如果 xx 和 yy 都大于等于 0,则步数为 2*(xx+yy);如果 xx 和 yy 中有一个小于 0,则步数为 2*abs(xx-yy)-1。\
  4. 更新最小步数:将每次计算得到的步数与当前的最小步数进行比较,更新最小步数。\
  5. 输出最小步数:输出最小步数。
C++ 代码优化:计算最小解步数的详细解析

原文地址: https://www.cveoy.top/t/topic/pSmE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录