CSP 模拟26

A:字符交换

可以发现最后的答案只与一种字符有关
枚举最后所有点都聚到了哪个中间点
枚举之后贪心的向中间去移动左右两边的点
这样可以求出k次移动最多使当前位置出现多少个连续字符
每次取max就是答案




B:平方数

正解可以做到(n^{frac{1}{3}})筛平方因子 %%lin4xu
首先平方数一定各个质因子的次幂都是偶数次
那么对于(p1^{k1}*p2^{k2}*...)(k1,k2为奇数)
这个数和(p1*p2*...)是等效的
所以直接把所有数都化成(p1*p2*...)的形式
然后统计相同的个数就可以了
但是直接把一个数的平方因子都筛掉是根号级别的
所以考虑优化
一个数一定可以表示为(x^2*y)的形式 其中y是个质因子
考虑如何优化筛(x^2)
发现对于一个数 (x,y)不可能同时大于1e3
那么可以考虑只筛1e3以内的质数
如果质数有奇数个就记录下来
定为cur
这样如果筛完之后 剩下的数如果是个平方数
那么最后一定和cur是等效的
如果筛完之后 剩下的数不是个平方数
那么它一定也不含有平方项了
因为如果含有平方项 一定是大于1e3的因子的平方
而由于不是个平方数 所以一定也有一个大于1e3的质因子
乘起来显然大于1e9
所以最后一定就是剩下的数乘以cur
然后就很好处理了 随便开桶 或者离散化 或者写哈希表都能过




C:多维网络

80pts 显然可以用傻逼容斥随便写
考虑容斥复杂度瓶颈: 一条不合法路径被重复计算了多次
那么考虑唯一表示一条不合法的路径 并且不重不漏
可以用第一次经过的坏点是哪个来表示一条路径
而且显然不会重和漏
假定第一次经过的坏点是i的方案数是f[i]
那么把终点也看成坏点 也可以一样求出终点的答案
考虑怎么求第一次经过的坏点是i的方案数
显然很好求
用所有到i的方案数 减去第一次经过的坏点是j的方案数*j到i的方案数就可以了




D:Lesson5!

咕咕咕

如初见 与初见
原文地址:https://www.cnblogs.com/HISKrrr/p/13902320.html