我的做法大概更暴力一点,不怎么需要讨论。
不妨设 ,可以注意到若 ,则一定可以在 场或 场结束,或者无解。这一部分可以用 的暴力来枚举。
当 时,不断构造 就可以转化到前面的情况。
int main() {
int T = rr();
while (T--) {
ll x = rr(), y = rr();
bool flag = false;
if (y > x) {
flag = true, swap(x, y);
}
vector<pair<ll, ll>> ans;
auto push = [&](ll ta, ll tb) {
if (flag)
swap(ta, tb);
ans.emplace_back(ta, tb);
};
while (x - y >= 13) {
x -= 11, push(11, 0);
}
auto allow = [](ll x, ll y) {
if (x < y)
swap(x, y);
if (x < 0 || y < 0)
return false;
if (x - y == 2)
return x >= 11;
if (x - y > 2)
return x == 11;
return false;
};
auto try_1 = [&](ll x, ll y) {
for (int i = 0; i <= 11; i++) {
for (int j = 0; j <= 11; j++) {
if (allow(i, j) && allow(x - i, y - j)) {
push(i, j), push(x - i, y - j);
return true;
}
}
}
return false;
};
bool ret = false;
if (!ret && allow(x, y)) {
push(x, y);
ret = true;
}
if (!ret) {
ret = try_1(x, y);
}
if (ret) {
printf("YES\n%zu\n", ans.size());
for (auto [a, b] : ans) {
printf("%lld %lld\n", a, b);
}
} else {
printf("NO\n");
}
}
return 0;
}