专栏文章

题解:UVA1482 Playing With Stones

UVA1482题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip1osp1
此快照首次捕获于
2025/12/03 04:43
3 个月前
此快照最后确认于
2025/12/03 04:43
3 个月前
查看原文
这是一个有向图博弈,直接考虑 SG 函数。
先设最终状态,即 SG(0)=SG(1)=0\mathrm{SG}(0)=\mathrm{SG}(1)=0
那么 SG(i)=mexj=1i2SG(ij)\mathrm{SG}(i) = \mathrm{mex}_{j=1}^{\lfloor\frac{i}{2}\rfloor} \mathrm{SG}(i-j)
赛时可以通过暴力打表发现规律,也可以考虑数学证明。
结论:SG(x)={x2xmod2=0SG(x12)xmod2=1\mathrm{SG}(x)=\begin{cases}\frac{x}{2} & x\bmod 2=0 \\ \mathrm{SG}(\frac{x-1}{2}) & x\bmod 2=1\end{cases}
证明:
x2x\le 2 时结论成立,
x>2x > 2 时,假设 y<x\forall y<x,结论成立,
  • xmod2=0x\bmod 2=0SG(x)=mex{SG(x2),,SG(x1)}\mathrm{SG}(x)=\mathrm{mex}\{\mathrm{SG}(\frac{x}{2}),\dots,\mathrm{SG}(x-1)\}
    SSxx 的转移点集合,
    • 对于 yS,ymod2=0y\in S,y\bmod 2=0SG(y)\mathrm{SG}(y) 覆盖 [x4,x2][\lceil\frac{x}{4}\rceil,\frac{x}{2}]
    • 对于 yS,ymod2=1y\in S,y\bmod 2=1,发现这些 yy 对应的 y12\frac{y-1}{2} 构成 zz 的转移点,其中 z={x2+1x2mod2=1x2x2mod2=0z=\begin{cases}\frac{x}{2}+1 & \frac{x}{2}\bmod 2=1 \\ \frac{x}{2} & \frac{x}{2}\bmod 2=0\end{cases},(特别的,如果 x2\frac{x}{2} 是奇数,那么 x212\frac{\frac{x}{2}-1}{2} 不是 zz 的转移点,那么 zz 会缺一个转移点 z1z-1,但由于 SG(x212)=SG(z1)\mathrm{SG}(\frac{\frac{x}{2}-1}{2})=\mathrm{SG}(z-1),因此不影响)。
    因此 xmod2x\bmod 2 时结论成立。
  • xmod2=1x\bmod 2=1:这时 xx 相对于 x1x-1 的转移点来说,少了一个 x12\frac{x-1}{2},多了一个 x1x-1,因此 SG(x)=SG(x12)\mathrm{SG}(x)=\mathrm{SG}(\frac{x-1}{2})
综上所述,结论成立。
CPP
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

const int N = 1e2 + 5;

int n;

LL SG(LL a) {
    while (a & 1) {
        a = ((a - 1) >> 1);
    }
    return (a >> 1);
}

void solve() {
    cin >> n;
    LL a, sum = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a;
        sum ^= SG(a);
    }
    cout << (sum ? "YES\n" : "NO\n");
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int T;
    cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...