3051 - 找规律系列之:醋神爱玩BALL

醋神爱玩BALL,大家都知道,而且玩着玩着,玩的脸残了(默哀3分钟),但他又碰到了关于BALL

游戏,所以他又要去玩了:已知有两个盒子,有ABALLS在第一个盒子中,有BBALLS在第二个盒子里且

球数满足(0<A+B<=2147483648.现在醋神要求将若干个球从一个盒子移动到另一个盒子,而且要求移动球

的个数与目标盒子内球的个数相同,你要判断的是,能不能把其中一个盒子的球,经过若干次移动全部移

空,如果可以输出最少移动次数,否则输出-1.雯神表示“玩个BALL的BALL呀,还不如揉揉自己脸上的肉肉”。

题目输入

包含多组数据,每一行包含两个数A B 

题目输出

对于每组输入数据,如果可以满足条件,输出最小移动次数,否则输出-1

输入/输出样例

题目输入

2 6

题目输出

2

提示

如果第一个盒子球多,只能把第一个盒子移动到第二个盒子,反之只能从第二个盒子移动到第一个盒子,如果两个球数一样,那下一步就能随便怎么移动了,因此样例的移动方法为 把6个球拿2个放入另一个盒子,现在两个盒子里面  都是4个,然后再随便将一个盒子里的4个球移动到另一个盒子,就能让一个盒子清空了, 所以需要2次移动.

C++解答

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;

long long gcd(long long a,long long b)
{
    if(b==0)
        return a;
    else
        return gcd(b,a%b);
}

int main()
{
    //freopen( "B.txt", "r", stdin );
    //  freopen( "_B.txt", "w", stdout );
    long long  a,b;
    while(cin>>a>>b)
    {
        long long g=gcd(a,b);
        a=a/g;
        b=b/g;
//        cout<<a<<" "<<b<<endl;
        long long ans=a+b;
        long long sum=ans;
//        cout<<ans<<endl;
        bool flag=0;
        for(; ;)
        {
            if(ans&1)
            {
                if(ans==1)
                {
                    flag=1;
                }
                break;
            }
            ans/=2;
        }
        if(flag==0)
        {
            cout<<-1<<endl;
        }
        else
        {
            long long co=0;
            while(sum)
            {
                co++;
                sum/=2;
            }
            cout<<co-1<<endl;
        }
    }
    return 0;
}

提示

如果第一个盒子球多,只能把第一个盒子移动到第二个盒子,反之只能从第二个盒子移动到第一个盒子,如果两个球数一样,那下一步就能随便怎么移动了,因此样例的移动方法为 把6个球拿2个放入另一个盒子,现在两个盒子里面  都是4个,然后再随便将一个盒子里的4个球移动到另一个盒子,就能让一个盒子清空了, 所以需要2次移动.

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题