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;
}