这是后手时的程序,
auto getmsb = [](ll x) {for (int i = 59; ~i; i--) if (x >> i & 1) return i;};
auto popcount = [](ll x) {int res = 0; for (int i = 59; ~i; i--) if (x >> i & 1) res++; return res;};
cout << "second" << endl;
ll p1, p2;
cin >> p1 >> p2;
while (p1 && p2) {
// *1
ll p = popcount(p1) & 1 ? p2 : p1;
ll p1 = 1ll << getmsb(p), p2 = p ^ p1;
cout << p1 << " " << p2 << endl;
cin >> p1 >> p2;
assert(p1 != -1 && p2 != -1);
// *2
if (!p1 && !p2) break;
}
这会被这样子卡掉:
n=28
后手。
交互库:7,27
我:选择 27,拆分为 16,11
交互库:选择 11,拆分为 10,1。
这时候,程序会一直拆分为 16,11,而 p 也一直是 27,十分玄学,在 *2 处发现 p1 p2 变为了 10,1,但 *1 处又变回了 16,11
能通过的代码:
cout << "second" << endl;
ll p1 = 1, p2 = 1;
do {
cin >> p1 >> p2;
if (!p1 && !p2) break;
ll p = popcount(p1) & 1 ? p2 : p1;
ll p1 = 1ll << getmsb(p), p2 = p ^ p1;
cout << p1 << " " << p2 << endl;
} while (p1 && p2);