1 条题解
-
0
自动搬运
来自洛谷,原作者为

max67
bobo搬运于
2025-08-24 22:53:54,当前版本为作者最后更新于2024-01-07 21:12:14,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前言
这是我写过的题中推式子过程中最长的一题,有必要写篇题解来抚慰一下心灵。
所以说 KH 搬题为什么不把自己的题解放上去,不过可以上 QOJ 看:链接。
题解
Part 0.前导
根据 SG 函数,我们定义 为一个长度为 的序列的 值,记 。那么答案相当于 。
那么根据定义,有 。
若 ,根据归纳可得 。
因此 。注意到 $(4x)\bigoplus(4x+1)\bigoplus(4x+2)\bigoplus(4x+3)=0$,(注意到末尾两位恰从 取到 ,而其他位不变,因此异或和为 。),因此 $h(d)=\bigoplus_{i=4\lfloor\frac{d}{4}{\rfloor}}^{d}i=\bigoplus_{i=0}^{d\mod 4}x-i$。
接下来默认 。
Part 1. 的表示
我们统一考虑 的情况,因为此时 的转移式子相同。打表可知, 在 是一个循环节长度为 的 到 的排列,证明如下:
归纳设 时满足条件,考虑 时的值,由于 ,因此 的转移恰好考虑到 到 的排列,因此 ,并且 到 是一个长度为 的从 到 的排列。逐项考虑可知,。易知也构成排列。
我们设 。由于 。因此我们只需考虑 的情况。
因此我们可以初步列出转移式子:
$$g(r,d)=\begin{cases}r,d=0\\g(r-1,d-(r+1)+r^{k}-r^{k-1}),d\not =0\end{cases} $$(第二个式子是因为 ,减完后 次根号的值改变。又由于 ,因此只会减少 。)
考虑 ,有:
$$r^{k}-(r-1)^{k} = r^{k}-\sum_{i}C_{k-1}^{i}(-1)^{k-i}r^i \pmod r $$因此 $g(r-1,d-(r+1)+r^{k}-r^{k-1}\mod r)=g(r-1,(d-1+(-1)^{k+1} \mod r)$,讨论后面一项小于 的情况,有:
$$g(r,d)= \begin{cases} r,d=0\\ g(r-1,d\mod r ),2 \nmid k\\ g(r-1,r-1),2 \mid k,d=1\\ g(r-1,(d-2)\mod r), 2\mid k,d\ge 2 \end{cases} $$注意到当 时, ,由于 ,因此
当 时,注意到 $g(r-1,(d-2)\mod r)=g(r-\lfloor\frac{d}{2}\rfloor,d\mod 2)$,因此考虑暴力展开。注意到第二项只会是 ,那么讨论 的情况,有:
$$g(r,1)=g(r-1,r-1)=g(r-1-\lfloor\frac{r-1}{2}\rfloor , (r-1) \mod 2)=g(\lceil \frac{r-1}{2}\rceil , (r+1) \mod 2) $$ $$=\begin{cases} \lfloor\frac{r}{2}\rfloor,2\nmid r\\ g(\lfloor\frac{r}{2}\rfloor,1),2\mid r\\ \end{cases} $$递归下去,记 表示 ,即 的前导 个数。有:
那么带回原式,可得:
$$g(r,d)= \begin{cases} r,d=0\\ d-1,2 \nmid k\\ \lfloor\frac{r}{2^{\alpha(r)+1}}\rfloor,2 \mid k,d=1\\ g(r-\lfloor\frac{d}{2}\rfloor,d\mod 2), 2\mid k,d\ge 2 \end{cases} $$Part 1.5 辅助数组计算
定义辅助函数:$h_0(r)=\bigoplus_{i=0}^{r}i,h_1(r)=\bigoplus_{i=0}^{r}g(i,i)=\bigoplus_{i=1}^{r+1}\lfloor\frac{i}{2^{\alpha(i)+1}}\rfloor=\bigoplus_{i=0}^{r+1}\lfloor\frac{i}{2^{\alpha(i)+1}}\rfloor$。
考虑快速求出辅助函数的值,其中 ,而对于 ,我们尝试用递归的方式计算,具体的,我们发现我们可以直接计算 为奇数的值,而对于 为偶数,则令他们变成 递归计算。因此:
$$h1(r)=\bigoplus_{i=0}^{\lfloor\frac{r+1}{2}\rfloor}\lfloor\frac{i}{2^{\alpha(i)+1}}\rfloor\bigoplus_{i=0}^{\lfloor\frac{r}{2}\rfloor}i $$$$=h1(\lfloor\frac{r-1}{2}\rfloor)h0(\lfloor\frac{r}{2}\rfloor) $$Part 2. 的表示
注意到我们需要计算前缀和,因此记 $s(r,d)=\bigoplus_{i=0}^{d}g(r,i),s(r)=s(r,(r+1)^{k}-r^k-1),\sigma (r)=\bigoplus_{i=0}^{r}s(r)$,我们需要快速计算这些值。
先考虑计算 。因为 有长度为 的循环节,根据异或的特性,显然有 。那么我们先考虑计算 的循环节数量的奇偶性。注意到 。这表明 恰好是由若干个循环节再加上或减去一个数异或而成的:若 ,正好多了 ;若 ,正好少了 。
接下来计算循环节数量的奇偶性。我们考虑补上或删去一个数使得整个序列恰好有很多个循环节组成。因此:
$$=\frac{(r+1)^{k}-(-1)^{k+1}-\sum_{i}C_{k}^{i}(-1)^{k-i}(r+1)^{i}}{r+1} $$$$=(r+1)^{k-1} - \sum_{i>0}C_{k}^{i}(-1)^{k-i}(r+1)^{i-1} -\frac{(-1)^{k+1}+(-1)^{k}}{r+1} $$$$=(r+1)^{k-1}-\sum_{i>0}C_{k}^{i}(-1)^{k-i}(r+1)^{i-1} $$(考虑用二项式展开凑出 的因子化简)
注意我们要计算奇偶性,那么考虑原式子模 的值。注意到若 ,有 ,并且 ,因此,式子等于:
$$=(r+1) +\sum_{i>1}C_{k}^{i}(r+1)+C_{k}^{1} \pmod 2 $$注意到 Lucas 定理的特例,,因此:
$$=(r+1) +\sum_{i>1}[i\subset k](r+1)+C_{k}^{1} \pmod 2 $$$$=r+k+1+(2^{\text{popcount}(k)}-2)(r+1)=r+k+1 \pmod 2 $$(其中 表示 的 的个数,由于 ,因此此项一定为偶数)
分类讨论,可知 。因此:
$$s(r)=\begin{cases} g(r,r),2\mid k\\ g(r,0),2\nmid k,2\mid r\\ g(r,0)\bigoplus h_0(r),2\nmid k,2\nmid r \end{cases} $$因为第三项转移保证 ,因此式子可以写成:
$$s(r)=\begin{cases} g(r,r),2\mid k\\ r,2\nmid k,2\mid r\\ r\bigoplus [r\mod 4 =1],2\nmid k,2\nmid r \end{cases} $$Part 2.5 的表示
若 ,则有:
$$\sigma(r)=\bigoplus_{i=0}^{r}s(i)=\bigoplus_{i=0}^{r}g(i,i)=h1(r),2\mid k $$若 ,则有:
$$\sigma(r)=\bigoplus_{i=0}^{r}s(i)=\bigoplus_{i=0}^{r}g(i,0)\bigoplus_{i=0}^{\lfloor\frac{r-1}{2}\rfloor}[2i+1\mod 4 =1] $$注意到只有 才会对 产生贡献,那么此时后面式子的异或和形成了长度为 的循环节,并且只有落在 中间时异或值才为 ,有:
Part 3. 的表示
由于:
$$g(r,d)= \begin{cases} r,d=0\\ d-1,2 \nmid k\\ \lfloor\frac{r}{2^{\alpha(r)+1}}\rfloor,2 \mid k,d=1\\ g(r-\lfloor\frac{d}{2}\rfloor,d\mod 2), 2\mid k,d\ge 2 \end{cases} $$那么考虑暴力展开后递归:()
$$=\bigoplus_{i=0}^{d}g(r-\lfloor\frac{d}{2}\rfloor,d\mod 2) $$$$=\bigoplus_{i=0}^{\lfloor\frac{d}{2}\rfloor}g(r-\lfloor\frac{d}{2}\rfloor,0)\bigoplus_{i=0}^{\lfloor\frac{d}{2}\rfloor-[2\mid d]}g(r-\lfloor\frac{d}{2}\rfloor-1,r-\lfloor\frac{d}{2}\rfloor-1) $$$$=h0(r)\bigoplus h0(r-\lfloor\frac{d}{2}\rfloor-1)\bigoplus h1(r-1)\bigoplus h1(r-\lfloor\frac{d-1}{2}\rfloor-2) $$$$=h0(r)\bigoplus h0(r-\lfloor\frac{d}{2}\rfloor-1)\bigoplus h1(r-1)\bigoplus h1(r-\lfloor\frac{d+1}{2}\rfloor-1) $$若 ,因为 (),显然有 $s(r,d)=g(r,0)\bigoplus g(r,1..d)= r\bigoplus h0(d-1),2\nmid k,d=1$。因此结合起来,有:
$$s(r,d)=\begin{cases} h0(r)\bigoplus h0(r-\lfloor\frac{d}{2}\rfloor-1)\bigoplus h1(r-1)\bigoplus h1(r-\lfloor\frac{d+1}{2}\rfloor-1),2\mid k\\ d,2\nmid k,d=0\\ r\bigoplus h0(d-1),2\nmid k,d=1\\ \end{cases} $$那么,我们能以 的时间算出 ,那么总的时间复杂度为 。
Part 4.实现
#include<bits/stdc++.h> #define int long long using namespace std; const int N=5e5+100; int k; int a[N]; int power(int x,int y){int t=1;for(;y;y>>=1,x=x*x)if(y&1)t=t*x;return t;} int h0(int x){int res=0;for(int i=0;i<=x%4;i++)res^=x-i;return res;} int h1(int x){if(x<=1)return 0;return h1((x-1)/2)^h0(x/2);} int s(int r,int d) { if(d>2*r+2)d%=2*r+2; if(d>r)return h0(r)^s(r,d-r-1); if(k%2==0)return h0(r)^h0(r-(d/2)-1)^h1(r-1)^h1(r-(d+1)/2-1); if(d==0)return r; return r^h0(d-1); } int sigma(int x){if(!x)return 0;if(k%2==0)return h1(x);return h0(x)^(1<=x%8&&x%8<=4?1:0);} int solve(int x) { if(k==1)return h0(x); int r=pow(x,1.0/k); while(power(r,k)>x)r--;while(power(r+1,k)<=x)r++; return sigma(r-1)^s(r,x-power(r,k)); } signed main() { int _;scanf("%lld%lld",&_,&k); while(_--) { int t,res=0,x;scanf("%lld",&t); while(t--)scanf("%lld",&x),res^=solve(x); puts(res?"Lily":"Kaguya"); } return 0; }后记
赛场上还是有不少巨佬过这题的,我觉得他们可能是能打表出 的规律(形式简洁),对于 的情况,打表发现 呈现 段公差为 的等差数列,再暴力计算。
- 1
信息
- ID
- 9617
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者