数据很小,头尾各处理一半。
通过找规律可以得到
对于二维的翻硬币游戏,显然我们需要使用 NIM 积来计算 SG 函数。论文《从”k倍动态减法游戏”出发探究一类组合游戏问题》给出了一个 O(log2x) 的解法,但是由于此题的数据范围较大。所以这个方法不足以解决改题。下面是根据 03 官方题解和官方标程,得到的另一种非常高效的做法。
假设我们已经求了 x,y∈[0,255] 的所有 x⊗y 的值( ⊗ 即表示NIM积运算),我们现在用这个预处理的结果 O(1) 计算出 x,y∈[0,65535] 的所有 x⊗y 的值。
我们需要用到一些 NIM 积的性质。
设 x=a1×28+a2=(a1×28)⊕a2 , y=b1×28+b2=(b1×28)⊕b2
因此我们可以得到代码:
inline uint nim16(uint x, uint y) {
uint a1=x>>8,a2=x&255;
uint b1=y>>8,b2=y&255;
uint c1=nim8[a1][b1];
uint c2=nim8[a1^a2][b1^b2];
uint c3=nim8[a2][b2];
return ((c2^c3)<<8)|(nim8[c1][128]^c3);
}
通过同样的方法,最终我们可以在 O(1) 的时间内,得到任意一个 x,y∈[0,232−1] 的 x⊗y 的值。
对于需要预处理的部分,我们可以先利用同样的思路,计算出所有 2a⊗2b 的值,再算出所有 x,y∈[0,255] 的所有 x⊗y 的值。
至此,对于 NIM 积的求解得到了很好的解决。
回归到此题上,此题是一个经典的 Rugs 游戏,即二维 Ruler 游戏模型。根据 tartan 定理,我们只要求出对应两维的 Ruler 游戏的 SG 值,通过 NIM 积即可得到 Rugs 游戏的 SG 值。在 Ruler 游戏中, SG(x)=lowbit(x) ,而 [1,n] 中所有数的 lowbit(x) 的异或和为 n⊕[n2] ,因此我们可以利用类似求矩形面积并的的方式,求解整个的 SG 值。
利用期望的线性性,我们只需要考虑每个女生对答案的贡献即可。
不难发现这个图是一个内向树。
假设有 m 个节点能够到达这个女生,对于任意一种没有选取该女生的方案,这 m 个点一定都没有被选过。这种情况下选取 0 号女生的概率与选取该女生的概率之比为 m:1 ,但是从结果上来说,选取 0 号女生是必然事件,所以选取该女生的概率为 mm+1 。
我们拓扑排序,先计算好链的部分,再枚举环,计算每个点的贡献。
还有一个小问题就是答案的输出,题目要求 pq−1 ,且 p 和 q 是互质的状态。看上去很麻烦,实际是很好处理的。
我们先考虑两个不互质的数 p1 和 q1 和其约分后的结果 p2 和 q2 ,不难发现 p1×q−11=p2×q−12(mod1000000007) ,所以约分是没有意义的。
此外,不难发现,两个分数 p1q1 和 p2q2 我们分别计算 pq−1 并求和,即可得到这个分数通分后 pq−1 的结果。因此,实际上输出是比较简单的。
因为是 3 次方,所以我们考虑 3 个数 a,b,c 对答案的贡献。假设 a,b,c 互不相同,它对答案的贡献为选出这 3 的方案数乘以 n−ia−jb−kc 的划分数 p(n−ia−jb−kc) 。
因此我们首先要解决划分数的问题。利用生成函数的知识,我们容易得到
仔细分析题目,容易的得到以下几个性质:
下来我们来考虑下每个环的样子:
这样我们能想到一个简单的 dp 方程,但是这个是 O(nk√) 的,当 k 比较大的时候,可以直接 dp ,比较小的时候,我们需要构造线性递推,用矩阵倍增来进行转移。
按照题解的方法做了一遍。。。
实际上我们只需要求出最多的联通块个数。考虑到每个联通块至少有两个猴子,所以我们需要在树上求最大匹配,用 dp 解决即可。
首先考虑无论怎样旋转 线段两侧的点的个数是维持不变的。因此问题转化成在坐标轴旋转的过程中如何按x轴维护点的序列。考虑在坐标轴y以外方向的点对,当坐标轴旋转时其相对顺序不会发生改变。因此按点对的向量将点对预处理好,扫一遍即可。
贪心。我们每次把任务分给在空闲状态下,上一次任务结束时间最晚的那台机器。用堆维护下即可。
次小短路。正反跑两边 dijkstra 判断下每条非最短路径树的边对答案的贡献。