bzoj4036[HAOI2015]set 按位或


Vfk的集合冪級數論文的例題….隨機集合並為全集的期望集合數….這篇題解里的東西基本來自vfk的論文.

首先根據期望的線性性,我們把需要走第1步的概率(一定為1)加上需要走第2步的概率(等於走了第一步之后沒有得到全集的概率)加上需要走第3步的概率(等於走了兩步之后沒有得到全集的概率)….一直加到需要走正無窮步的概率就是期望的步數.那么走了x步之后沒有得到全集的概率等於走了x步之后得到不是全集的集合的概率之和.那么我們用集合並卷積定義乘法,把給出的概率視作集合冪級數,求集合冪級數的等比數列之和,把除了全集一項的其他項的值加起來就是答案.

集合冪級數的莫比烏斯變換和莫比烏斯反演:從f[]數組求得F[]數組,使得F[x]=sigma{f[j],j&x==j},F[]稱作f[]的莫比烏斯變換,f[]稱作F[]的莫比烏斯反演.

集合冪級數的等比數列之和不容易直接求,但集合冪級數的莫比烏斯變換的等比數列之和易求,而且集合冪級數的莫比烏斯變換的等比數列之和就是集合冪級數的等比數列之和的莫比烏斯變換,我們莫比烏斯反演回來就得到了集合冪級數的等比數列之和.

那么我們只要能快速求解集合冪級數的莫比烏斯反演和莫比烏斯變換,問題就解決了.

Vfk論文里的快速莫比烏斯變換(FMT):

for(i=0;i<n;++i)
    for(j=0;j<(1<<n);++j)
        if(j&(1<<i))f[j]+=f[j^(1<<i)];

 

快速莫比烏斯反演:

for(i=0;i<n;++i)
    for(j=0;j<(1<<n);++j){
        if(j&(1<<i))f[j]-=f[j^(1<<i)];

兩個過程基本相同,快速反演相當於把快速變換的過程倒了過來.

我們直接在f數組上運算,算法結束后f數組中保存原數組的莫比烏斯變換或莫比烏斯反演.

莫比烏斯變換其實相當於n維前綴和,莫比烏斯反演其實相當於n維差分.也可以用DP來理解。集合並卷積還算是集合冪級數中比較良心易懂的東西.

智商着急現場:http://liu-runda.blog.uoj.ac/blog/2360


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM