洛谷题解洛谷题解题解:P11275 微观戏剧
xyx404
思路:
数学题。
当 x 等于 y 时,从 x 到 y 最少只要 0 步。
当 x 不等于 y 时,从 x 到 y 最少需要的步数要分两种情况考虑:
- 直接过去,步数为 lcm(x,y)。
- 通过最大公因数过去,步数为 lcm(x,gcd(x,y))+lcm(y,gcd(x,y))。
答案为两种情况里的最小值。
考虑到 long long
范围不够,所以用 __int128
。
代码:
#include<bits/stdc++.h> using namespace std; #define itn int #define ull unsigned long long __int128 x,y; __int128 read(){ bool f=1;__int128 x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=!f;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=(f?x:-x); return x; } void write(__int128 x){ if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar(x%10+'0'); return; } __int128 __lcm(__int128 x,__int128 y){ return x/__gcd(x,y)*y; } int main(){ int q; cin>>q; while(q--){ x=read();y=read(); if(x==y)cout<<0<<"\n"; else{ __int128 g=__gcd(x,y); __int128 ans1=__lcm(x,g)+__lcm(y,g),ans2=__lcm(x,y); write(min(ans1,ans2)); cout<<"\n"; } } return 0; }
|