我的做法大概更暴力一点,不怎么需要讨论。

不妨设 x>yx>y,可以注意到若 xy<13x-y < 13,则一定可以在 11 场或 22 场结束,或者无解。这一部分可以用 11×1111 \times 11 的暴力来枚举。

xy13x - y \geqslant 13 时,不断构造 11:011:0 就可以转化到前面的情况。

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;
}