石 子 石子 石子
19 7 28
最 初 想 法 \color{blue}{最初想法} 最初想法
以下
N
N
N 表示 必胜态,
P
P
P 表示 必败态,
先考虑一堆石子, 手玩后发现奇数恒为
P
P
P, 偶数恒为
N
N
N,
小证明: 奇数为 2 n + 1 2n+1 2n+1, 由于 奇 ∗ 奇 = 奇 奇*奇=奇 奇∗奇=奇, 所以去掉其中一个因子后一定为偶数, 而偶数一定是能够取的, 因为最终状态 1 1 1 为奇数 .
然后把 M M M 堆石子搞成奇数个偶数即可 .
错的 .
正 解 部 分 \color{red}{正解部分} 正解部分
经过打表发现
S
G
(
x
)
=
max
{
i
∣
2
i
SG(x) = \max\{i\ |\ 2^i
SG(x)=max{i ∣ 2i|
x
}
x\}
x}, 即一个数字的
S
G
SG
SG 值为这个数字的二进制表示中
2
末
尾
0
的
个
数
−
1
2^{末尾 0 的个数}-1
2末尾0的个数−1,
相当于
S
G
(
x
)
=
l
o
w
b
i
t
(
x
)
−
1
SG(x)=lowbit(x)-1
SG(x)=lowbit(x)−1 .
可以初步了解到 S G ( 奇 数 ) = 0 SG(奇数) = 0 SG(奇数)=0,
题目转化为: 求出 M M M 个 S G SG SG值 异或起来等于 0 0 0 的方案数,
设 s u m [ x ] sum[x] sum[x] 表示 S G SG SG值 等于 x x x 的石子数量 种类数, x ∈ [ 1 , l o g n ] x∈[1, logn] x∈[1,logn],
s
u
m
[
0
]
=
⌊
n
+
1
2
⌋
sum[0] = \lfloor \frac{n+1}{2} \rfloor
sum[0]=⌊2n+1⌋
s
u
m
[
1
]
=
⌊
n
−
s
u
m
[
0
]
+
1
2
⌋
sum[1] = \lfloor \frac{n-sum[0]+1}{2} \rfloor
sum[1]=⌊2n−sum[0]+1⌋
s
u
m
[
2
]
=
⌊
n
−
s
u
m
[
1
]
+
1
2
⌋
sum[2] = \lfloor \frac{n-sum[1]+1}{2} \rfloor
sum[2]=⌊2n−sum[1]+1⌋
.
.
.
\ \ \ \ \ \ \ \ \ \ \ \ \ \ .\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ .\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ .
. . .
s
u
m
[
n
]
=
⌊
n
−
s
u
m
[
n
−
1
]
+
1
2
⌋
sum[n] = \lfloor \frac{n-sum[n-1]+1}{2} \rfloor
sum[n]=⌊2n−sum[n−1]+1⌋
当把一个数列的 二进制表示 全部去掉末尾只有
1
1
1个
0
0
0 的数字后,
再将其余数字的二进制末尾减去
1
1
1 个
0
0
0, 发现剩余的数字又会重新 连续 起来 .
依此得到上式 .
设 F [ i , j ] F[i, j] F[i,j] 表示前 i i i 堆石子, S G SG SG 异或起来等于 j j j 的方案数,
F [ i , j ] = F [ i − 1 , j ⨁ k ] + s u m [ k ] F[i, j] = F[i-1, j \bigoplus k] + sum[k] F[i,j]=F[i−1,j⨁k]+sum[k]
发现可以使用 倍增 的方式优化,
F [ i , j ] = F [ i − 1 , j ⨁ k ] ∗ F [ i − 1 , k ] F[i, j] = F[i-1, j \bigoplus k] * F[i-1, k] F[i,j]=F[i−1,j⨁k]∗F[i−1,k]
时间复杂度 O ( l o g M ∗ l o g 2 N ) O(logM*log^2N) O(logM∗log2N),
得分 50 p t s 50pts 50pts .
当
N
N
N 和
M
M
M 是大数时, 需要先使用 高精度 预处理出所有
s
u
m
[
]
sum[]
sum[],
然后对于
d
p
dp
dp 的转移, 发现是异或卷积的形式, 可以用
F
W
T
FWT
FWT 优化, 没学过的可以看 这里 .
时间复杂度 O ( 能 过 ) O(能过) O(能过) .
得分 100 p t s 100pts 100pts .
实 现 部 分 \color{red}{实现部分} 实现部分
有时间再补 .
咕咕咕 .