山重水复疑无路,柳暗花明又一村。
也许马上就柳暗花明了呢?
La Vaca Saturno Saturnita↗
鉴定为 CF 评测机神力,时间复杂度 。
设当前位置为 ,我们枚举当前 的每个因子,然后二分找到下一个最近因子出现的位置 ,那么 就要加上 ,然后 除以 ,将 赋值成 后,开启新一轮的轮回。
时间复杂度里一个 来自 个查询,一个 来自 个因数,剩下的两个 来自二分查找和需要跳 次。因为因数个数远远没有 个,他也不会实打实的跳 次,所以应该算是非常小的常数了,能卡着时限过。
Easy Demon Problem↗
确实是 Easy。
发现 。直接枚举 ,看看 里有没有 或者 , 也是同理,如果都有就是 YES,如果对于所有的 都没有,那就是 NO。
Zapina↗
简单计数 dp,鉴定为涨信心题。
设 表示已经分了 个人,一共用了 本书,有没有人高兴。
转移方程也是十分的简单。枚举下一个人分配的书数量,有 。然后这个组合数是因为这 本书是互相区分的。
制杖题↗
我是制杖。
一眼容斥,但是需要注意的是:对于前三个点,它的 能开到 ,所以记得数组开大点。
Modulo Permutations↗
不是所有的计数题都用容斥
我们经过一番手玩,发现这个序列旋转后一定能变成两个单调递减的子串拼起来。一个子串的结尾是 ,另一个是 。我们钦定 结尾的子串在前,那么这个序列就形如 。
观察到题意里说的这是一个排列,那么我们设 表示 在以 结尾的子串里,那么这个 一定是由一堆极长的,只由 或 组成的子串构成。设 表示考虑 , 的方案数,初始有 。
考虑如何转移。我们发现这个极长子串内一定是合法的,因为 。转移时枚举 作为下一段开头,我们只用考虑 是否 就是了。
我们枚举 的倍数并加上余数进行转移,最终的答案就是 。减一是因为 都存在, 和 必然有一个不能延续到末尾。乘 是因为 个点都可以作为环的起点。
时间复杂度 。
众数 II↗
今天的重量级选手来了。
设展开后的数组叫 。我们发现 能成为众数当且仅当 且每个区间的结尾都 。所以我们可以写出 暴力:
for (int x = 2; x <= V; x++) for (int i = 1; i <= n; i++) for (int j = i; j <= n && a[j] >= x; j++) ans = (ans + a[j] - x + 1) % mod;对于贡献为 的,我们记录所有贡献不为 的区间数,剩下的就是贡献为 的区间数了。
考虑优化。我们发现在 固定的情况下, 也固定,所以我们可以这样:
for (int x = 2; x <= V; x++){ for (int i = 1; i <= n; i++) { if (a[i] < x) continue; int p = i; while (a[p + 1] >= x) p++; for (int j = i; j <= p; j++) ans = (ans + (a[p] - x + 1) * (p - i + 1)) % mod; }}复杂度 。
然后就是一大堆乱七八糟的推式子,建议直接阅读原文↗。
后日谈
我能等到柳暗花明的那一天吗?
