非常好的一个题,一开始打算纯暴,结果发现出现了好多循环,后来发现了这个游戏其中的内涵
还是以前的逆推思想,终态是(2*x,0),那么上一步一定是(x,x),再上一步是(3/2x,1/2x),再上一步有两种情况(就不一一举出了),再上一步还有两种情况...
最终可推得A,B只有满足(A+B)/GCD(A,B)==2^k时才会成立,k即为移动次数
#include <stdio.h>
#include <string.h>
#define LL long long
LL d[40];
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
d[0]=1;
for(int i=1; i<40; i++)
{
d[i]=d[i-1]*2;
}
LL A,B;
while(scanf("%I64d%I64d",&A,&B)==2)
{
int f=0;
if(A==0||B==0)
{
printf("0\n");
continue;
}
for(int i=1; i<40; i++)
{
if((A+B)/gcd(A,B)==d[i])f=i;
}
if(f)
printf("%d\n",f);
else
printf("-1\n");
}
return 0;
}