Exciting Bets
题目:
找到达到两个数的gcd最大的最小步数
两个数同时加减能得到的最大公约数是这两个数的差dis
a=b+dis,所以a,b哪个来操作都可以
ans=min(b%g,g-b%g) //一个是减到能整除dis的步数,另一个是加到能整除dis的步数
官方代码:
#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while(t--) { long long a,b; cin >> a >> b; if(a==b) cout << 0 << " " << 0 << '\n'; else { long long g = abs(a-b); long long m = min(a%g,g-a%g); cout << g << " " << m << '\n'; } } }
我的废物代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; long long a,b; int main() { int t; scanf("%d",&t); while(t--) { scanf("%lld %lld",&a,&b); if(a==b) printf("0 0\n"); else if(a-b==1||b-a==1) { printf("1 0\n"); } else if(a==0) { printf("%d 0\n",b); } else if(b==0) { printf("%d 0\n",a); } else { if(a>b) { long long dis=a-b; if(a%dis==0&&b%dis==0) printf("%lld 0\n",dis); else { //bС long long w=0,q=0; long long ta=a,tb=b,ttb=b; if(dis>=tb) w=dis-tb; else if(dis<tb) { w=(tb/dis+1)*dis-tb; q=tb-(tb/dis*dis); w=min(q,w); } if(w<tb) { printf("%lld %lld\n",dis,w); } else printf("%lld %lld\n",dis,tb); } } else { long long dis=b-a; if(a%dis==0&&b%dis==0) printf("%lld 0\n",dis); else { long long w=0,q=0; long long ta=a,tb=b,tta=a; if(dis>=ta) w=dis-ta; else if(dis<ta) { w=(ta/dis+1)*dis-ta; q=ta-ta/dis*dis; w=min(q,w); } if(w<ta) { printf("%lld %lld\n",dis,w); } else printf("%lld %lld\n",dis,ta); } } } } }
浙公网安备 33010602011771号