你这 E 和 F 怎么难度相差这么大啊。
但是我感觉可能我 F1 就差一点啊。
题意
对于一个长度为
称这个序列是好的,当且仅当对于所有
求有多少好的序列(长度没有限制),满足其中所有元素都为
easy ver.:
hard ver.:
题解
先来看 F1。
首先能发现一些东西,令
那么可以发现一定有
那么就还可以知道,对于一个好的序列一定有
这相当于是,对于一个
这也说明了
考虑我们已经知道了
可以发现,这个序列一定是形如 先下降再上升这个样子的,如何证明呢。
考虑如果有两个“谷”的位置,那么在
而如果这个序列只有一个“谷”,那么就肯定只能是先下降再上升这个样子。
所以排列
那么也就是说,我们只需要计算出升序的
先不考虑系数问题,我们现在需要求出这样一个问题:
给定
升序且最大值不超过 ,即 ; - 后缀 gcd 互不相同,即令
,有 。
这看起来就可以 dp,令
边界状态是对于
考虑
那么所有的
前缀和优化一下,直接转移就能做到 怎么没有一个 F0
啊。
我们注意到 ,那么是否可以枚举
考虑令
那么按照从大到小的顺序枚举
可以发现,它可以从
但是有一个问题,就是此时可能会算重,假如一个状态可以转移到
但是这里处理比较简单,直接从大到小枚举每一个数字,让它的因数减掉它即可。
考虑复杂度,枚举
所以总复杂度是
等等你那个 。
其实系数只需要在,每一次新添加一个数字的时候,给方案数
代码。
再来看 F2。
这次没有了
但是这里有一个很自然的解决方法,就是将原来的 dp 倒着转移。
什么叫倒着转移呢?
原来的 dp,边界为
现在我们把他全部反过来。
初始状态为所有
具体一点,现在的
现在需要往这个序列前面添加若干元素(可以不添加),使得这个序列合法,前面有多少添加的方案。
这样我们就只需要一开始跑一遍 dp,然后统计
具体的 dp 转移直接把上面的全部反着抄过来就好了。
可以将原来的 dp 过程看作,一张有向图,求的是起点到终点有多少种不同的路径。
现在我们将所有的边都反向,边权不变,求出终点到起点有多少种不同路径,两个问题答案显然相同。
想要推转移的话,把原来的图画出来就非常好反向了。
令
代码。怎么就比时限少了十几毫秒的。
但是其实还能优化一点,可以发现代码中有两处复杂度瓶颈。
而这两处复杂度瓶颈都可以通过 SOS DP 进行优化(其实就是,把质数当成进制的高维前缀和)。
令
代码。其实没快多少。