7月1日计数题题解
"错的不是我,是这个世界"
时间暂定,月考加油
T1
CF1043F Make It One
清芷:这不是最小覆盖吗
EI:这种问题一般都很本质,你转化出了dp就再想想
清芷:gcd莫反一下幂...
我:???
somebody:min卷积没有小于O(n^2)的做法
我:哦/kk
首先我们有个暴力的O(n^3)做法:硬点某个数一定要被选,然后dp一下,表示S集合里的质因数都还在要都不在的最小选数个数
于是f_S=min_{j&i==j}f_{j}^f_{i^j},且为初始态
然后您T了,虽然可以玄学贪心前面的硬点部分但是下面DP是很慢的QAQ
弱者就止步于此/kk
...等等?
你会惊人的发现这个S好像就么点啊,因为3e5以内最多质因数也就6个了
也就是说DP的复杂度其实不是O(n^2),而是一个很玄学的东西
那么我们是不是有什么做法就是玄学硬点然后暴力DP就过去了?
std:
考虑表示选k个数是否可行
k可以枚举,大小也就是7
然后考虑计算,需要容斥,设表示公约数为i的方案数
然后,cnt[i]表示i的倍数个数
这个好像和莫反确实有点联系qwq
T2
CF451E Devu and Flowers
多重集容斥
首先考虑一个简单的问题,就是每个多重集有无穷多个(或者说大于我们要取得数)
这个相当于我们有m个0,然后每个集合要抢占其中一些0表示选了自己集合中多少个数
然后现在这样干包括了一个集合选超过个的不合法方案,要剪掉QAQ
为什么硬点一个集合至少选了是这个呢?相当于我们提前拿出个给这个集合,然后剩下的自由分配qwq
然后你会发现您减重了两个集合都选超过的不合法方案,所以要加回来,容斥下去就好了
T3
CF568B Symmetric and Transitive
暂时搁浅
T4
CF839D Winter is here
暴力计数是考虑长度为i的子序列的贡献,然后就是和T1差不许多啦
但是这样不太行QAQ因为复杂度是O(n^2)的,你发现T1是枚举了一个长度啊
那...能不能改改,变成表示约数为i的一些数构成子序列的总长度!
然后显然我们有,表示约数为i的数个数
然后表示gcd为i的数的........总长度
那么我们就有
所以搞出f,就做完啦!
复杂度是瓶颈在于求
T5
CF1097F Alex and a TV Show
月考爆炸来写博客QAQ
首先看完前两个操作感觉很亲民?
然后第三个就使我爆炸
看眼数据范围,1e5,1e6/jk但是值域只有7000
不会了
考虑bitset,因为是gcd所以考虑反演一下
表示i作为约数的出现次数qwq,用bitset记录%2后的值
然后我们对于操作1就是把值的v的bitset赋给那个
而操作2就是两个bitset异或一下qwq
而操作3就是and一下
最后考虑怎么反推回每个数出现次数
对于每个值v,把μ(d|v)%2的值单独存一个bitset这个题就是and一下做完了
复杂度
T6
CF1097D Makoto and a Blackboard
蒟蒻的想法:
把所有约数搞出来,然后考虑建图,问题变成了走k步的到某个点的方案数,可以矩阵乘法...
复杂度...n<=1e6还可以,因为约数个数是级别的,而n^3可能也就跑个100
std:
我们显然有表示值为i,已经j次操作的概率是多少这个状态
但是i太大,所以考虑变成某个质因子的指数
ans显然积性函数,所以
然后求每个次幂的单独的ans
表示已经进行了j次操作的概率
然后不难发现
初始状态是
就做完了qwq
复杂度很玄学?反正T不掉