Tsawke 的三月模拟赛 题解

最佳贪污

原题 LG-P4005 小 Y 和地铁

找一下性质,发现对于只有一个交点的站点一定无贡献,对于有且仅有两个交点的考虑发现其有效状态只有四种(即发现对于从线段的左端点与右端点绕过是等效的),于是考虑随机一个初始状态后 O(n2) 判断任意两条线段是否有交,可以发现这是正确的。然后感性理解发现答案满足类似多峰函数的性质,考虑模拟退火,每次随机一个位置并随机一个新的权值 O(n) 更新即可,对于大多数参数都可以保证 90+pts,参数较为优秀时可以 AC。

转置!转置!不择手段地转置!

原题 SP422 TRANSP2 - Transposing is Even More Fun

双倍经验 SP419 TRANSP - Transposing is Fun

10% 是给手画的。

30% 是任意搜索等。

70% 就是 SP419。

100% 就是加强版 SP422。

挺长时间以前写的题解:

一道很好的群论题,尤其是其中转化的思想还是很高妙的。

不难发现,我们考虑按序为矩阵标号,从 0 开始,则问题转化为我们要进行一次类似于置换的操作,如对于 a=1,b=2

(0123456704152637)

这个东西朴素的交换次数是 2a+b 的,但是不难发现,对于一个循环的置换,我们是可以优化掉一次交换操作的,如 (1,2,4)(4,1,2) 就可以用 31=2 次解决,于是如果我们找出整体有多少个循环,令其为 x,则答案为 2a+bx,考虑计算 x

由题面中 2a 的信息我们或许可能想到将其从二进制上考虑,发现变化即为将其二进制循环向左位移 a 位,或向右位移 b 位,证明不难,考虑转置变化为:i×2b+jj×2b+i,意义上就是将二进制位分割后交换,与上述操作等效。

于是我们想到,若将二进制数抽象为长度为 a+b 的环,对其进行 0/1 染色,置换为静止和旋转 a,对于旋转 a,显然环数为 gcd(a,a+b)=gcd(a,b),看起来很正确,但是仔细想一下就会发现这个置换群不存在逆元,所以不是群,无法计算。

这时就存在一个很人类智慧的转化,我们可以容易想到每 a+bgcd(a,b) 个点在一个环内,或者说每 gcd(a,b) 个数之后就会遇到应与其在同一环内的点,那么我们就可以将这 gcd(a,b) 个点缩为一个大点这样它们之间的任意染色都不会使得数同构,那么问题转化为我们用 2gcd(a,b) 个颜色去染 a+bgcd(a,b) 个点,令 n=a+bgcd(a,b) 置换为旋转 0,1,2,,n1。现在其满足性质,直接套用 Polya 定理,考虑经典套路,得到:

1ni=1n(2gcd(a,b))gcd(n,i)

用经典的莫反思想推导:

1ni=1n2gcd(a,b)gcd(n,i)=1ndni=1n2gcd(a,b)d[gcd(n,i)=d]=1ndni=1nd2gcd(a,b)d[gcd(nd,i)=1]=1ndn2gcd(a,b)dφ(nd)

可以通过精细实现达到 O(T(n+logn)) 的复杂度,但是意义不大,本题不卡,直接 O(T(n34+nlogn)) 强行处理即可。

加强版:

有点不太理解这道题的意义,完全就是更卡常一点,需要更加精细实现,本质没有任何变化。。

推导部分完全相同,最终式子:

1ndn2gcd(a,b)dφ(nd)

发现对于 2k 最多 a+bgcd(a,b)×gcd(a,b)=a+b,于是可以预处理 2k,然后我们可以通过分解质因数后 dfs 跑一下,同时处理 φ 即可每次 O(n) 处理该式,故最终复杂度 O((a+b)+T(n+logn)),可以通过。

Upd:一种新的思路:

考虑将二进制数抽象为长度为 a+b 的环,对其进行 0/1 染色,置换为旋转 a,2a,3a,,a+bgcd(a,b)a(显然最后一项等效为单位元,即旋转 0)。发现这样设计即可满足置换群的所有要求,且符合题意。

考虑套用一下 Polya,对于旋转 ka,显然环的个数为 gcd(ka,a+b),黑白染色即为 2gcd(ka,a+b),所以令 n=a+bgcd(a,b),答案即为:

1nk=1n2gcd(ka,a+b)

然后进行一些转化:

gcd(ka,a+b)=gcd(a,b)×gcd(kagcd(a,b),a+bgcd(a,b))=gcd(a,b)×gcd(k,a+bgcd(a,b))=gcd(a,b)×gcd(k,n)

接下来的步骤则与之前相同。

学习?不可能!

原题 LOJ #6672. 「XXOI 2019」惠和惠惠和惠惠惠

大概是我目前做过所有题里最有意思的了。(推式子多有意思)

5% 是给 puts("0") 的。

问题可抽象为在平面直角坐标系中从 (0,0)(n,0),共有 (1,1),(1,0),(1,1) 三种向量可用,需要碰到共 k 次坐标轴,不能超过坐标轴到第四象限的方案数。

考虑 DP,设状态 dp(i,j) 表示从 (0,0)(i,0) 经过 j 次的方案数,设 g(i) 表示从 (0,0)(i,0) 的方案数。

显然有:dp(i,j)=k=0i1dp(k,j1)×g(ij),初始 dp(0,1)=1,答案为 dp(n,k)

对于 g,容易发现其意义为 Motzkin Numbers,其还有一个意义就是在圆上等分 n 点中画不相交弦的方案数。

令默慈金数为 h(n),则有 g(n)=h(n2),于是有转移:h(n)=h(n1)+i=0n2h(i)×h(n2i)

从圆上画弦很好理解,从本题理解略有困难,大概是钦定一个从 y=1y=0 的分割点然后初始还要钦定一个向上的,也就是一部分枚举在空中的,一部分枚举可以碰到坐标轴的,加的 h(n1) 就是最后直接平着走的。

以上似乎就是个 O(n2k) 的 DP,可以通过 30%

容易发现其生成函数为:H(x)=xH(x)+x2Hx(x)+1,这个东西网上全都是直接放结论没有地方说怎么推的(可能太套路了吧),所以我类比卡特兰数的生成函数推导学习了一下,大概思路就是表示出来 H(x) 然后再表示出来 H2(x),然后会有形如 h(n+2)xnh(n+1)xn 的东西,对 H2(x) 乘一下 x2 然后把漏下的补回来就可以全都表示成和 H(x) 相关的,中间需要用到边界 h(0)=h(1)=1

解个一元二次方程将 H(x) 解出来会发现有两个解,通过生成函数或者说形式幂级数的特性要求 H(0)=1 可以舍去一个解。或者说我认为从 limx0xx=1(洛必达可证)或者说用两次洛必达给解出来求二阶导或许也能证?(存疑

继续考虑用 h 的生成函数表示出来 g 的生成函数,这是平凡的,然后再将 g 带进 f,简单推导后得到最终要求的式子:

[xn](1+x12x3x22)k1

此时对于 60% 的数据直接跑多项式开根,然后跑多项式快速幂或者多项式乘法 + 快速幂即可。

再往下就有各种各样的做法了,这里简单提几个并丢一下链接。

首先直接 100% 的做法,考虑使用 EI 科技 本题整式递推的简要推导 也就是使用最标准最暴力的整式递推,强行推式子,最后可以得到一个 F+F+F=0 的形式,当然还有很多复杂系数,将其展开可以发现与前三项有关,手算 0,1,2 的部分然后 O(n) 递推即可,线性求逆元后复杂度线性。

对于一个 80% 的做法,考虑发现其为整式递推形式,考虑枚举递推的系数多项式的次数和递推长度,然后用人类智慧的高斯消元验证并求解,复杂度优秀但需要支持多项式。另一份题解(一个比较高明(有趣)的做法)

还可以考虑通过某些方式获取结论发现 h 的递推较为简短,可以强行枚举并验证,复杂度大概会有个 206,然后一只 log 做快速幂。题解(一个十分垃圾的做法)

然后是一些可能用到的资料:

一类通过生成函数求线性递推式的方法.pdf

一类通过生成函数求线性递推式的方法

LOJ #6672. 「XXOI 2019」惠和惠惠和惠惠惠(生成函数,整式递推)

用生成函数推导默慈金数的递推式

高等数学——详解洛必达法则

用母函数推卡特兰数通项公式

0的零次方等于多少?

微分有限函数

微分有限生成函数

整式递推数列

线性递推与整式递推数列