L - LCM Walk HDU - 5584 (数论)

时间:2023-03-08 18:41:55
L - LCM Walk HDU - 5584 (数论)

题目链接:

L - LCM Walk

HDU - 5584

题目大意:首先是T组测试样例,然后给你x和y,这个指的是终点。然后问你有多少个起点能走到这个x和y。每一次走的规则是(m1,m2)到(m1+lcm(m1,m2),m2)或者(m1,m2+lcm(m1,m2))。

具体思路:

lcm(m1,m2)=m1*m2/(gcd(m1,m2)).然后m1就能表示成t1*gcd(m1,m2),m2能表示成t2*gcd(m1,m2)。然后(m1,m2)就能走到(t1*gcd(m1,m2),t2*gcd(m1 , m2)+t

1*t2*gcd(m1,m2)).我们就每次判断m2能不能整除t2*(gcd(m1,m2)+t1*gcd(m1,m2))就可以了。

这个过程gcd(m1,m2)是保持不变的。因为t1和t2是互素的,然后t1和t1+1是互素的,然后t1和(t1+1)*t2也是互素的。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e5+;
int main()
{
int T,Case=;
scanf("%d",&T);
while(T--)
{
int x,y;
scanf("%d %d",&x,&y);
printf("Case #%d: ",++Case);
int tmp=__gcd(x,y);
if(x>y)
swap(x,y);
int ans=;
while(y%(tmp+x)==)
{
ans++;
y=y/(tmp+x)*tmp;
if(x>y)
swap(x,y);
}
printf("%d\n",ans);
}
return ;
}