THUPC2018看题总结
#6387. 「THUPC2018」绿绿与串串 / String
据说是签到题啊。
首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋。
自然地,我们先发掘发掘那个对称轴需要具备哪些性质。
发现如果对原串做(Manacher)的话,对称轴的回文半径是一定会延长到结尾的。
又发现如果一个位置的回文半径延长到了结尾那么这个字符一定是一个对称轴。
好,现在我们知道所有对称轴了。
但是如果只输出每个对称轴所在的位置的话会少算那种操作多次才能达到目的的(R)。
而现在我们只需要验证对于一个前缀,哪些(R)经过一顿操作之后能完全等于这个前缀。
而这些所有的(R)显然满足大的(R)是小的(R)的二倍减一因为最终的长度是确定的。
故此我们设(g[i])表示最小的(R)能不断反转而完全构成前(i)个字符所构成的字符串。
最后暴力输出一下就好了。
#6388. 「THUPC2018」赛艇 / Citing
这题我觉得还挺好的(学长们说是二维(FFT),瑟瑟发抖.....
我们发现,如果这鬼东西是一维的那显然好做啊。
就是给定两个(01)串,问存不存在一个起点使得把第二个串和第一个串上的起点对齐使得第二个串每个有(1)的位置在第一个串上都是(0)。
这就那(FFT)搞一搞就好了。
详细点就是:
第一个多项式(A)中的(A[i])表示第一个串的第(i+1)个字符是啥,(B)多项式对应第二个。
翻转之后卷一起成了(C)就变成了:(C[i]=sumlimits_{j=0}^{i-1}A[j] imes B_R[i-1-j])。只有两个都是(1)的位置(C[i])才不是(0)所以扫一遍判一下就好了。
现在考虑二维的怎么办,其实也非常简单就是把下一列首尾相接接到上一列后面就好了。
这样就转化成了第一个问题。
至于第二个串怎么求呢,那就暴力按照它给的方向扫一扫就好了。只有走到的位置是(1)其余的是(0)。
之后就像上面说的一样(FFT),扫一扫就好了嘛。
#6389. 「THUPC2018」好图计数 / Count
我勒个去这个题真的是...绝了......
假设(n)个点的好图个数设为(f_n)。
设(f)构成的普通生成函数是(F),就是(F=sumlimits f_ix^i)。
设连通好图个数为(g_n)。
我们考虑把这个(F)表示表示。
考虑一下把(n)分成几个不同的数相加的形式,然后对于每一个都求一下好图个数在除个阶乘什么的发现根本没法做啊。
我们现在给出一个式子:
这是为什么呢?
我们考虑把一个(i)个点的连通好图,因为有(g_i)种,我们把它们排序。
而(sum)中的(i)表示选取了多少个大小为(k)的连通好图。
就是:从第一个(k)中的第(k')个括号中选取了(x^{cnt imes k}),就表示这个好图中包含了(cnt)个大小为(k)且形状是把(g_k)个(k)点联通好图排序后的第(k')个。
可能有点拗口....但是还是比较好理解的。
下一步的话,我们发现中间那个(sum)的式子,就是(sumlimits_{ige 0} x^{ik})有点眼熟.....它其实就等于(sumlimits_{ige 0} (x^k)^i)。
而这鬼东西我们发现,根据麦克劳林展开的逆变换,把它变回展开之前的模样就是(frac{1}{1-x^{k}})。
所以原式子变成了
发现这个大(prod)很(gay gay)啊,完全处理不了的样子嗷....
化简乘积的方法就是取对数把它变成求和再通过一些手段把对数函数删掉。
发现如果取(ln)的话刚好可以通过求导删掉所有的对数函数,故此我们对原序列先取(ln)再求导。
中间式子就不列了,最后的式子就等于:
之后我们把每一项拆开看(此处(ORZ cdsszjj))
然后就变成了
发现和分治(NTT)好像啊诶我是不是切了啊哈哈哈哈
等等,(g)是啥。
我们不难发现,一个联通好图和一个不连通好图是一一对应的因为如果一个联通好图的补图也是联通好图显然没有办法构造出来啊。
所以(g_i = f_i / 2)。
我们先设(h(n) = sum limits_{i|n & i<n}i imes g_i)。
那么后面的式子就被我们分成了两部分。
我们把式子分成两部分考虑:
第一部分是(sumlimits_{i=0}^nf_if_{n-i}),第二部分是(sumlimits_{i=0}^nf_ih_{n-i})。
先说第一部分吧
就是自卷积分治(NTT)。
就相当于求(K_{n+1} = sumlimits_{i=0}^n K_i imes K_{n-i})。
这东西咋做呢,我们假设已经处理出来了(K_1)到(K_{frac{n}{2}})。
那么对于一个(jin (frac{n}{2},n]),(K_j)由两部分组成。
第一部分是两个数都已知,第二部分是两个数,一个已知一个未知(两个未知的数不可能有贡献的因为这样下标和就大于(n)了)。
关于第一部分的话,我们就把前半部分自己和自己相乘就好了。
后半部分怎么办呢?
我们发现就是正常的分治(NTT)的形式。就是(f_{n+1} = sumlimits_{i=0}^n f_i g_{n-i})。
后半部分的(K)就相当于上述式子中的(f),而前半部分的(K)就相当于(g)因为已经处理好了。
所以只需要对后半部分分治(NTT)一下就好了。
总时间复杂度是(O(nlog^2n))。
现在我们看看第二部分怎么办。
为什么我们一定要把上述式子分成两个部分?
因为一个数的约数如果不是自己的话一定不大于自己除以2,这就说明第二部分的所有值都已知。
那么好我们来看一看那个整除关系怎么办啊....
其实也很简单就是枚举前一半区间的每个数,上后一半区间里去找看有没有整除的,这个时间复杂度是调和的。
再算上分治我们总时间复杂度是(O(nlog^2n))。
嗯这题就解决了。
记得到了分治叶子的时候别忘了把(f_l)乘上(l)。
#6392. 「THUPC2018」密码学第三次小作业 / Rsa
这个题很好啊....
真的是自己想想不到,看了题解觉得自己是傻逼的题.....
就是把第一个式子所有都自乘(x)次方,把第二个式子自乘(y)次方然后上下乘一起就变成了:
然后对于(m)的指数求一下(exgcd)就好了.....
就好了....
好了....
了....
#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop
第一眼觉得不咋可做。
但是看到了(m)非常小,就在线段树上的每个节点开一个长度为(m)的数组。
这个数组的第(i)个数表示他对应维护区间的代价为(i)的权值最大值。
然后暴力维护就好了。
至于查询怎么办呢?
就是对于提取出来的区间先合并到一起,然后对于合并好的数组跑完全背包就好了(qwq)。
#6397. 「THUPC2018」蛋糕 / Cake
这个题直接就秒了因为这个才4维。
学长考过一个最多(10^5)维的同样问题。
那就非常简单了,打打表就出来了。
#6398. 「THUPC2018」生生不息 / Lives
这个题比较常规。
首先我们发现答案只有(25)种情况,极易想到打表。
而且题目中的转移关系是唯一的。
就是一张一个点只有一条出边的有向图。