#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int x, y, z, d;
}s, e;
void run(node &u)
{
int num[3] = {u.x, u.y, u.z};
sort(num, num + 3);
u.x = num[0]; u.y = num[1]; u.z = num[2];
}
bool judge(node u, node v)
{
if (u.x == v.x && u.y == v.y && u.z == v.z)
return true;
return false;
}
node getroot(node &u)
{
node t = u;
int p, q, r;
p = t.y - t.x; q = t.z - t.y;
while (p != q)
{
if (q > p)
{
r = (q - 1) / p;
t.x += r * p;
t.y += r * p;
}
else
{
r = (p - 1) / q;
t.z -= r * q;
t.y -= r * q;
}
u.d += r;
run(t);
p = t.y - t.x; q = t.z - t.y;
}
return t;
}
node getpre(node &u, int step)
{
node t = u;
int p, q, r;
while (step)
{
p = t.y - t.x; q = t.z - t.y;
if (q > p)
{
r = (q - 1) / p;
r = min(r, step);
t.x += r * p;
t.y += r * p;
}
else
{
r = (p - 1) / q;
r = min(r, step);
t.z -= r * q;
t.y -= r * q;
}
step -= r;
run(t);
}
return t;
}
int main()
{
while (~scanf("%d %d %d", &s.x, &s.y, &s.z))
{
scanf("%d %d %d", &e.x, &e.y, &e.z);
e.d = s.d = 0;
run(s);
run(e);
if (!judge(getroot(s), getroot(e)))
printf("NO\n");
else
{
int len = abs(s.d - e.d);
if (s.d > e.d)
s = getpre(s, len);
else
e = getpre(e, len);
int l = 0, r = min(s.d, e.d);
while (l < r)
{
int mid = (l + r) / 2;
if (judge(getpre(s, mid), getpre(e, mid)))
r = mid;
else
l = mid + 1;
}
printf("YES\n%d\n", len + 2 * l);
}
}
return 0;
}
HDU - 3830 Checkers
最新推荐文章于 2019-07-15 23:50:47 发布