题意:有一只青蛙,它从起点(x,y)出发,每次它会走LCM(x,y)步[LCM(x,y)就是x,y的最小公倍数]到达点(x+LCM(x,y),y)或点(x,y+LCM(x,y)),最终,它会到达点(ex,ey),现给你终点(ex,ey),要你求出它的起点有多少种可能
解题思路:我们暂时假设x,y的最大公约数gcd(x,y)=k,那么我们不妨用来表示x,用来表示y,那么新得到的点必定是或,因为x与y的最小公倍数
我们不妨求解一下新的点x和y的gcd值,以点为例
因为和时互质的,和也是互质的,故
所以,我们可以发现先得到的点和原来的点有相同的最大公约数,故我们可以利用这一点来根据终点求解原先的起点
还有一点需要提及的是,对于当前点(x,y),x,y中小的那个值必定是之前那个点中的x值或y值,故我们可以开始逆推了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
int gcd(int x,int y)
{
if(x%y)
return gcd(y,x%y);
else
return y;
}
int main()
{
int t,cas = 0,x,y,k,ans;
scanf("%d",&t);
while(t--)
{
ans = 1;
scanf("%d %d",&x,&y);
if(x>y)
swap(x,y);
k = gcd(x,y);
while(y%(k+x)==0)
{
ans ++;
y = y/(x/k+1);
if(x>y) swap(x,y);
k = gcd(x,y);
}
printf("Case #%d: %d\n",++cas,ans);
}
return 0;
}