CF490 D. Chocolate

Problem - 490D - Codeforces

 

题意:

有2块大小分别为a1*b1和a2*b2的巧克力

每个1*1的小巧克力不可再分割

你可以进行若干次这个操作:

选择一块巧克力,吃掉现在大小的一半或者三分之一

注意你不能把1*1的巧克力破坏

请问至少吃多少次,使2块巧克力的面积相等,并求出最后他们的边长

 

有唯一分解定理可得

如果面积是2或者3的倍数,那么他们的边长必有2或3的倍数

所以可以直接考虑他们的面积

将面积进行质因子分解

吃掉1/2或者1/3的操作就是把2的指数减一或者把3的指数减一同时把2的指数加一

两个巧克力若想面积相同,他们除了2和3的质因子的指数都得相同

因为2的指数可加可减,所以先把3的指数搞成一样的

 

#include<bits/stdc++.h>
 
using namespace std;
 
int s[4][3],cut[4][3];
 
void cal(long long x,int w,int id)
{
    while(!(x%w))
    {
        s[w][id]++;
        x/=w;
    }
}
 
int main()
{
    int a[3],b[3];
    scanf("%d%d%d%d",&a[1],&b[1],&a[2],&b[2]);
    long long q1=1ll*a[1]*b[1],q2=1ll*a[2]*b[2];
    cal(q1,2,1);
    cal(q1,3,1);
    cal(q2,2,2);
    cal(q2,3,2);
    int sum=abs(s[3][1]-s[3][2]);
    if(s[3][1]<s[3][2])
    {
        cut[3][2]=s[3][2]-s[3][1];
        cut[2][2]-=cut[3][2];
    }
    else if(s[3][1]>s[3][2])
    {
        cut[3][1]=s[3][1]-s[3][2];
        cut[2][1]-=cut[3][1];
    }
    int h=abs((s[2][1]-cut[2][1])-(s[2][2]-cut[2][2]));
    sum+=h;
    if(s[2][1]-cut[2][1]<s[2][2]-cut[2][2]) 
    {
        cut[2][2]=h;
        cut[2][1]=0;
    }
    else 
    {
        cut[2][1]=h;
        cut[2][2]=0;
    }
    for(int w=1;w<=2;++w)
        for(int i=1;i<=cut[3][w];++i)
            if(!(a[w]%3)) a[w]=a[w]/3*2;
            else if(!(b[w]%3)) b[w]=b[w]/3*2;
    for(int w=1;w<=2;++w)
        for(int i=1;i<=cut[2][w];++i)
            if(!(a[w]%2)) a[w]/=2;
            else if(!(b[w]%2)) b[w]/=2;
    if(1ll*a[1]*b[1]!=1ll*a[2]*b[2]) printf("-1");
    else printf("%d\n%d %d\n%d %d",sum,a[1],b[1],a[2],b[2]);
}

 

posted @ 2021-10-04 19:39  TRTTG  阅读(30)  评论(0编辑  收藏  举报