Codeforces Round #279 (Div. 2), problem: (D) Chocolate

题意:给定两块巧克力,有两种切法:切一半或者切三分之一,留下三分之二的部分。问需要多少刀能使两块巧克力的面积相同,并输出两块巧克力的规格。

因为面积相同所以两个巧克力长宽乘积分解出来的质因数应该是一样的,因为我们可以有两种切法,所以我们能把多出来2变没了,我们也能把3变成2(因为切三分之一留三分之二),所以对于初始的两个面积,我们先分解质因数,比较一下除了二三以外的其他质因数有没有数量上的不同,有的话直接-1,没有的话就先比较3的个数,3的个数多了就变成2,在比较2,2的个数多了直接变为1也就是删除了,在变化过程中我们要对长宽进行变化,最后输出就好。

#include <stdio.h>
#include <math.h>
#include <string.h>
void ok3 (int &a,int &b,int c)
{
    while (c--)
    {
        if (a%3==0)
            a=a/3*2;
        else b=b/3*2;
    }
}
void ok2(int &a,int &b,int c)
{
    while (c--)
    {
        if (a%2==0)
            a=a/2;
        else b=b/2;
    }
}
int main ()
{
    int x1,y1,x2,y2;
    int q,w,c,d;
    int num1,num2;
    int a[100];
    int b[100];
    scanf ("%d%d%d%d",&x1,&y1,&x2,&y2);
    q=x1;
    w=y1;
    c=x2;
    d=y2;
    memset (a,0,sizeof (a));
    memset (b,0,sizeof (b));
    while (x1%2==0||x2%2==0||y1%2==0||y2%2==0)
    {
        if (x1%2==0)
        {
            a[0]++;
            x1/=2;
        }
        if (y1%2==0)
        {
            a[0]++;
            y1/=2;
        }
        if (x2%2==0)
        {
            b[0]++;
            x2/=2;
        }
        if (y2%2==0)
        {
            b[0]++;
            y2/=2;
        }
    }
    while (x1%3==0||x2%3==0||y1%3==0||y2%3==0)
    {
        if (x1%3==0)
        {
            a[1]++;
            x1/=3;
        }
        if (y1%3==0)
        {
            a[1]++;
            y1/=3;
        }
        if (x2%3==0)
        {
            b[1]++;
            x2/=3;
        }
        if (y2%3==0)
        {
            b[1]++;
            y2/=3;
        }
    }
    if (x1*y1!=x2*y2)
    {
        printf ("-1\n");
    }
    else
    {
        num1=a[0]+a[1];
        num2=b[0]+b[1];
        int ans=0;
        if (a[1]>b[1])
        {
            ans+=a[1]-b[1];
            ok3(q,w,a[1]-b[1]);
            a[0]+=a[1]-b[1];
            a[1]=b[1];
        }
        if (b[1]>a[1])
        {
            ans+=b[1]-a[1];
            ok3(c,d,b[1]-a[1]);
            b[0]+=b[1]-a[1];
            b[1]=a[1];
        }
        if (a[0]>b[0])
        {
            ans+=a[0]-b[0];
            ok2(q,w,a[0]-b[0]);
        }
        if (a[0]<b[0])
        {
            ans+=b[0]-a[0];
            ok2(c,d,b[0]-a[0]);
        }
        printf ("%d\n%d %d\n%d %d\n",ans,q,w,c,d);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值