狐狸分奶酪(codeforces 371b)

15 篇文章 0 订阅
1 篇文章 0 订阅

很容易想到的一个思路是暴力,就是对多的蛋糕吃,进行bfs();
一旦两种蛋糕相等,就是最小步数的,很容易写。注释掉的代码就是
还有更好的方法,很容易看出,最后的解一定是它们的最大公约数,然后把他们的最大公约数去掉,看看能不能吃成1,记下步骤,也可以看能不能吃成最大公约数,是一样的。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
int a,b;
struct date{
    int a;int b;int t;
};




/*int bfs(int a,int b){

    queue <date> q;
    date w;
    w.a=a;
    w.b=b; 
    w.t=0;
    q.push(w);
    date p;
    while(!q.empty()){
        p=q.front();
        q.pop();
        if(p.a==p.b)
        {
            printf("%d",p.t);
            return 0;
        }
        else if(p.a>p.b)//找大的蛋糕吃
        {//a
            if(p.a%2==0)    //吃1/2
        {
            p.a/=2;p.t++;
            q.push(p);
            p.t--;p.a*=2; 
        }
            if(p.a%3==0)    //吃2/3
        {
            p.a/=3;p.t++;
            q.push(p);
            p.t--;p.a*=3;
        }
        if(p.a%5==0)        //吃4/5
        {
            p.a/=5;p.t++;
            q.push(p);
            p.t--;p.a*=5;
        }
        }
        else {
            if(p.b%2==0)
        {
            p.b/=2;p.t++;
            q.push(p);
            p.t--;p.b*=2;
        }
        if(p.b%3==0)
        {
            p.b/=3;p.t++;
            q.push(p);
            p.t--;p.b*=3;
        }
        if(p.b%5==0)
        {
            p.b/=5;p.t++;
            q.push(p);
            p.t--;p.b*=5;
        }
        }//与a同理

    }
    return 1;//没结果就是骗他们了
}*/





int ans=0;
int gcd(int x,int y)
{
    if(x%y==0)
    return y;
    return gcd(y,x%y);
}
int made(int x,int y){
    while(x%y==0){
        x=x/y;
        ans++;
    }
    return x;
}
int main(){
    scanf("%d%d",&a,&b);




    int c=gcd(a,b);//最大公约数
    a/=c;
    b/=c;//除掉
    a=made(a,2);
    a=made(a,3);
    a=made(a,5);
    b=made(b,2);
    b=made(b,3);
    b=made(b,5);//吃完
    if(a==1&&b==1)
    printf("%d",ans);//都能吃完,说明狐狸没骗他们
    else printf("-1");//骗了






    //bfs
    /*if(bfs(a,b))//若果骗他们了
    printf("-1");*/

} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值