2017 Multi-University Training Contest

来源:互联网 发布:网络经营保健食品 编辑:程序博客网 时间:2024/06/05 08:29

A. Admiral [jds]

数据很小,头尾各处理一半。

B. Array Challenge [zmy]

通过找规律可以得到

Fn=7Fn14Fn2

矩阵倍增

C. Boring Game [zmy]

对于二维的翻硬币游戏,显然我们需要使用 NIM 积来计算 SG 函数。论文《从”k倍动态减法游戏”出发探究一类组合游戏问题》给出了一个O(log2x) 的解法,但是由于此题的数据范围较大。所以这个方法不足以解决改题。下面是根据03官方题解和官方标程,得到的另一种非常高效的做法。

假设我们已经求了x,y[0,255]的所有xy的值(即表示NIM积运算),我们现在用这个预处理的结果O(1)计算出x,y[0,65535]的所有xy的值。

我们需要用到一些 NIM 积的性质。

  • 交换律: xy=yx
  • 结合律: (xy)z=x(yz)
  • 分配律:(xy)z=(xz)(yz)
  • 对于x,y<22α
    • x22α=22αx
    • 22α22α=32×22α=22α22α1

x=a1×28+a2=(a1×28)a2y=b1×28+b2=(b1×28)b2

xy=((a1×28)a2)((b1×28)b2)

xy=((a1×28)(b1×28))((a1×28)b2)(a2(b1×28))(a2b2)

xy=(a1b1(2728))((a1×28)b2)(a2(b1×28))(a2b2)

xy=(a1b127)(a1b128)(a1b228)(a2b128)(a2b2)

xy=(28((a1b1)(a1b2)(a2b1)))(a1b127)(a2b2)

xy=(28(((a1a2)(b1b2))(a2b2)))(a1b127)(a2b2)

因此我们可以得到代码:

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,2321]xy的值。

对于需要预处理的部分,我们可以先利用同样的思路,计算出所有2a2b的值,再算出所有x,y[0,255]的所有xy的值。

至此,对于 NIM 积的求解得到了很好的解决。

回归到此题上,此题是一个经典的 Rugs 游戏,即二维 Ruler 游戏模型。根据 tartan 定理,我们只要求出对应两维的 Ruler 游戏的 SG 值,通过 NIM 积即可得到 Rugs 游戏的 SG 值。在 Ruler 游戏中,SG(x)=lowbit(x),而[1,n]中所有数的lowbit(x)的异或和为n[n2] ,因此我们可以利用类似求矩形面积并的的方式,求解整个的 SG 值。

D. Brother and Sister [zmy]

利用期望的线性性,我们只需要考虑每个女生对答案的贡献即可。
不难发现这个图是一个内向树。
假设有m个节点能够到达这个女生,对于任意一种没有选取该女生的方案,这m个点一定都没有被选过。这种情况下选取0号女生的概率与选取该女生的概率之比为m:1,但是从结果上来说,选取0号女生是必然事件,所以选取该女生的概率为mm+1
我们拓扑排序,先计算好链的部分,再枚举环,计算每个点的贡献。
还有一个小问题就是答案的输出,题目要求pq1,且pq是互质的状态。看上去很麻烦,实际是很好处理的。
我们先考虑两个不互质的数p1q1和其约分后的结果p2q2,不难发现p1×q11=p2×q12(mod1000000007),所以约分是没有意义的。
此外,不难发现,两个分数p1q1p2q2我们分别计算pq1并求和,即可得到这个分数通分后pq1的结果。因此,实际上输出是比较简单的。

E. Cube Summation [zmy]

因为是3次方,所以我们考虑3个数a,b,c对答案的贡献。假设a,b,c互不相同,它对答案的贡献为选出这3的方案数乘以niajbkc的划分数p(niajbkc)
因此我们首先要解决划分数的问题。利用生成函数的知识,我们容易得到

p(x)=1(1xi)

我们先用五边形数定理求其倒数:
(1xi)=k=0(1)kxk(3k±1)2

之后利用分治+NTT的做法得到p(N)的生成函数
接下来考虑a,b,c的方案数,根据数字相同的个数,利用的轮转对称性:。
a,b,c,i,j,k,ab,bc,acxia+jb+kc+3a=bc,i,j,kxamax{i,j}+ck+a=b=c,i,j,kxamax{i,j,k}

利用容斥原理可得
第一项:
(a,ixai)33(a,i,jxa(i+j))(a,ixai)+2a,i,j,kxa(i+j+k)

第二项:
3(a=b,i,jxamax{i,j})(a,ixai)3a=b=c,i,j,kxa(max{i,j}+k)

第三项不变
最后整理得到
(D(x)3+3S(x)D(x)+S2(x))

其中D(x)表示x的约数个数,S(x)表示x的约数和,S2(x)表示x的约数的平方和
利用NTT可以得到这部分
再乘上之前我们得到的p(x),即可得到最终的生成函数。

F. Function Counting [zmy]

仔细分析题目,容易的得到以下几个性质:

  • 我们认为xf(x)连了一条有向边,这样我们会得到若干个环。
  • 这个环中xx的距离一定恰好是环长的一半。
  • 这个环长的一半,即绝对值的个数n一定能整除k,且k/n为奇数,否则不会恰好到x的位置。

下来我们来考虑下每个环的样子:

  • n=1,方案只有一种
  • n=2,方案有两种,但值得注意的是,由于两个数的间距可以为1,也可以为2,所以我们要考虑连续一段长度为4时,有特殊的构造方法。
  • n=3,不妨设一段是1,2,3,每次一个数可以连向和它相同正负性的,也可以是相反正负性的,一共有4种。然后,我们会发现在连的时候,大多数长度都为2,但是会出现两次长度为1的跳跃。这个跳跃只能发生在开始或结束,所以一共有2种,总方案数为23
  • n>3 和之前相同的思路,方案数为2n

这样我们能想到一个简单的 dp 方程,但是这个是O(nk)的,当k比较大的时候,可以直接 dp ,比较小的时候,我们需要构造线性递推,用矩阵倍增来进行转移。

G. Jacana Number [zmy]

按照题解的方法做了一遍。。。

H. Monkeys [zmy]

实际上我们只需要求出最多的联通块个数。考虑到每个联通块至少有两个猴子,所以我们需要在树上求最大匹配,用 dp 解决即可。

I. Rotating Line [wbr]

首先考虑无论怎样旋转 线段两侧的点的个数是维持不变的。因此问题转化成在坐标轴旋转的过程中如何按x轴维护点的序列。考虑在坐标轴y以外方向的点对,当坐标轴旋转时其相对顺序不会发生改变。因此按点对的向量将点对预处理好,扫一遍即可。

J. Schedule [zmy]

贪心。我们每次把任务分给在空闲状态下,上一次任务结束时间最晚的那台机器。用堆维护下即可。

K. Two Paths [zmy]

次小短路。正反跑两边 dijkstra 判断下每条非最短路径树的边对答案的贡献。

原创粉丝点击