51Nod-1429-巧克力

ACM模版

描述

描述

题解

这里我们先来分析两种操作,操作一,是每次消除一个因子 2 ,操作二,是每次消除一个因子 3,再引入一个因子 2 ,那么实际上,当两个巧克力经过若干次消除因子 2 3 后,导致剩余的因子完全相同。

那么我们就可以通过这个来求最后的结果,首先我们经过若干次分解,获取每个巧克力的因子,这里我们可以直接四条边分别处理最后长宽加在一起弄,也可以先求巧克力面积,当然,何乐而不为呢?先求面积会少很多代码。接着呢?我们需要格外注意,我们需要先处理因子 3,因为操作二还会引入因子 2 ,所以呢,我们先求出两个巧克力因子 3 的数量差,然后对 3 因子多的那个巧克力加上若干个因子 2,数量刚好是前边所求的差,接着再求关于 2 <script type="math/tex" id="MathJax-Element-805">2</script> 因子的差,那么最后结果就是这两个差的和。

很好玩的一道题,有那么点贪心的意味……

代码

//#include <iostream>
//#include <cstring>
//
//using namespace std;
//
//const int MAXN = 5;
//
//int a1, b1; //  A a1 b1
//int a2, b2; //  B a2 b2
//int cnt_2[MAXN];
//int cnt_3[MAXN];
//
//void get_cnt(int cnt[], int &x1, int &x2, int &y1, int &y2, int div)
//{
//    while (x1 % div == 0)
//    {
//        cnt[0]++;
//        x1 /= div;
//    }
//    while (x2 % div == 0)
//    {
//        cnt[1]++;
//        x2 /= div;
//    }
//    while (y1 % div == 0)
//    {
//        cnt[2]++;
//        y1 /= div;
//    }
//    while (y2 % div == 0)
//    {
//        cnt[3]++;
//        y2 /= div;
//    }
//}
//
//int main()
//{
//    cin >> a1 >> b1;
//    cin >> a2 >> b2;
//    
//    int x_A = a1, x_B = a2, y_A = b1, y_B = b2;
//    
//    get_cnt(cnt_2, x_A, x_B, y_A, y_B, 2);
//    get_cnt(cnt_3, x_A, x_B, y_A, y_B, 3);
//    
//    
//    if (x_A * y_A != x_B * y_B)
//    {
//        cout << -1 << endl;
//    }
//    else
//    {
//        int ans = 0;
//        int cnt_A_2 = cnt_2[0] + cnt_2[2];
//        int cnt_B_2 = cnt_2[1] + cnt_2[3];
//        int cnt_A_3 = cnt_3[0] + cnt_3[2];
//        int cnt_B_3 = cnt_3[1] + cnt_3[3];
//        
//        int A_B_3 = 0, B_A_3 = 0, A_B_2 = 0, B_A_2 = 0;
//        if (cnt_A_3 > cnt_B_3)
//        {
//            A_B_3 = cnt_A_3 - cnt_B_3;
//            cnt_A_2 += A_B_3;
//            ans += A_B_3;
//        }
//        else
//        {
//            B_A_3 = cnt_B_3 - cnt_A_3;
//            cnt_B_2 += B_A_3;
//            ans += B_A_3;
//        }
//        
//        if (cnt_A_2 > cnt_B_2)
//        {
//            A_B_2 = cnt_A_2 - cnt_B_2;
//            ans += A_B_2;
//        }
//        else
//        {
//            B_A_2 = cnt_B_2 - cnt_A_2;
//            ans += B_A_2;
//        }
//        cout << ans << endl;
//    }
//    
//    return 0;
//}

#include <iostream>
#include <cstring>

using namespace std;

typedef long long ll;

int a1, b1; //  A a1 b1
int a2, b2; //  B a2 b2
ll area_A, area_B;
int cnt_A_2, cnt_B_2;
int cnt_A_3, cnt_B_3;

void get_cnt(int &cnt_A, int & cnt_B, int div)
{
    while (area_A % div == 0)
    {
        cnt_A++;
        area_A /= div;
    }
    while (area_B % div == 0)
    {
        cnt_B++;
        area_B /= div;
    }
}

int main()
{
    cin >> a1 >> b1;
    cin >> a2 >> b2;

    area_A = 1LL * a1 * b1;
    area_B = 1LL * a2 * b2;

    get_cnt(cnt_A_2, cnt_B_2, 2);
    get_cnt(cnt_A_3, cnt_B_3, 3);

    if (area_A != area_B)
    {
        cout << -1 << endl;
    }
    else
    {
        int ans = 0;
        int A_B_3 = 0, B_A_3 = 0, A_B_2 = 0, B_A_2 = 0;
        if (cnt_A_3 > cnt_B_3)
        {
            A_B_3 = cnt_A_3 - cnt_B_3;
            cnt_A_2 += A_B_3;
            ans += A_B_3;
        }
        else
        {
            B_A_3 = cnt_B_3 - cnt_A_3;
            cnt_B_2 += B_A_3;
            ans += B_A_3;
        }

        if (cnt_A_2 > cnt_B_2)
        {
            A_B_2 = cnt_A_2 - cnt_B_2;
            ans += A_B_2;
        }
        else
        {
            B_A_2 = cnt_B_2 - cnt_A_2;
            ans += B_A_2;
        }
        cout << ans << endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值