51Nod 1429 巧克力

Problem

现在有两个块巧克力一块大小是𝑎1 × 𝑏1 的,另外一块大小是𝑎2 × 𝑏2 的。

现在要把两块巧克力变成面积一样大小,可以使用下列两种方法:

· 可以沿横向或纵向的网格线分成两等分,然后吃掉其中的一份。

· 可以沿横向或纵向的网格线分成2/3,1/3的两份,吃掉小的那一份。

因此使用第一种方法会留一半巧克力,用第二种方法会留下2/3巧克力。

两种方法并不总是可行的,有些时候两种方法都不能再用了。比如巧克力大小是16 × 23的时候,可以使用第一种方法,但是不能使用第二种方法。当大小是20 × 18的时候,可以使用第一种方法或者第二种方法。如果大小是5 × 7的时候,两种方法都不能使用。

问最少要操作几次才能使得两块巧克力的面积是一样的。

Solution

要求面积相等,看面积里面有多少2和3的因子,有2做操作1,有3做操作1和2,去掉2、3之后得到的数一样就可行,答案是两块巧克力的操作一、操作二分别做差,绝对值之和。

Code

#include<stdio.h>
#include<set>
#include<iostream>
#include<stack>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
typedef long long ll;
typedef long double ld;
typedef double db;
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int mod=1e9+7;
inline int mo(ll a,int p){
    return a>=p?a%p:a;
}
inline int rd() {
    int x = 0, f = 1;
    char ch;
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return f * x;
}
inline ll gcd(ll x, ll y){
    return y==0?x:gcd(y,x%y);
}
inline ll speed(ll a,ll b){
    ll cur=a,anss=1;
    while(b){
        if(b&1) anss=anss*cur;
        cur=cur*cur;
        b>>=1;
    }
    return anss;
}
const int MAXN=1e5;
bool ipr[MAXN+20];
int cnt,pri[MAXN/5];
void prime(){//埃式筛法
    int N=sqrt(MAXN)+0.5,mul;
    memset(ipr,true,sizeof(ipr));
    ipr[1]=false;
    for(int i=2;i<=N;i++){
        if(ipr[i]==true){
            i==2?mul=1:mul=2;
            for(int j=i*i;j<=MAXN;j+=i*mul){
                ipr[j]=false;
            }
        }
    }
    for(int i=2;i<=MAXN;i++){
        if(ipr[i]==true){
            pri[++cnt]=i;
        }
    }
}
ll x,y,s1,s2;
ll n1,m1,n2,m2;
int main(){
    //io_opt;
    scanf("%d%d",&x,&y);
    s1=x*y;
    scanf("%d%d",&x,&y);
    s2=x*y;
    while(s1%2==0){
        n1++;
        s1>>=1;
    }
    while(s1%3==0){
        n1++,m1++;
        s1/=3;
    }
    while(s2%2==0){
        n2++;
        s2>>=1;
    }
    while(s2%3==0){
        n2++,m2++;
        s2/=3;
    }
    if(s1!=s2){
        printf("-1\n");
        return 0;
    }
    printf("%lld\n",abs(n1-n2)+abs(m1-m2));
    return 0;
}


posted @ 2020-06-26 11:38  CCWUCMCTS  阅读(112)  评论(0编辑  收藏  举报