【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】
傳送門
題意:定義兩個圖的異或的邊集為在兩張圖中恰出現一次的邊。給sss張nnn個點的圖的集合,求異或和為連通圖的子集數。
s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10
設GiG_iGi?表示異或出iii個連通塊的子集數,答案就是G1G_1G1?
GGG并不好求廢話,我們考慮一個看起來很對的求法:
雖然邊很多但點很少, 我們可以暴力枚舉連通塊中的點,復雜度是O(B(n))O(B(n))O(B(n)),BBB為貝爾數,B(10)=21147B(10)=21147B(10)=21147
可以確定的是不同連通塊間沒有邊,但連通塊間仍然不好確定,所以不能叫連通塊。為了區分,我們把枚舉出來的稱為「集合」。
設FiF_iFi?為異或出iii個集合的子集數,即只要求不同集合間沒有邊,同一集合間沒有要求沒有要求。
發現GGG可以表示出FFF:因為FFF的每個「集合」一定是若干連通塊構成的非空集合,即一個斯特林數
Fm=∑i=mn{im}GiF_m=\sum_{i=m}^n\left\{\begin{matrix}i\\m\end{matrix}\right\}G_iFm?=i=m∑n?{im?}Gi?
斯特林反演一波
Gm=∑i=mn(?1)i?m[im]FiG_m=\sum_{i=m}^n(-1)^{i-m}\left[\begin{matrix}i\\m\end{matrix}\right]F_iGm?=i=m∑n?(?1)i?m[im?]Fi?
答案為
G1=∑i=1n(?1)i?1[i1]Fi=∑i=1n(?1)i?1(i?1)!FiG_1=\sum_{i=1}^n(-1)^{i-1}\left[\begin{matrix}i\\1\end{matrix}\right]F_i \\=\sum_{i=1}^n(-1)^{i-1}(i-1)!F_iG1?=i=1∑n?(?1)i?1[i1?]Fi?=i=1∑n?(?1)i?1(i?1)!Fi?
現在我們只需要求出FFF
枚舉出集合后,只考慮所有圖中跨集合的邊(實現時取個&即可),然后需要求出多少個子集異或和為000
把所有圖插進線性基,設最終大小為sizsizsiz,那么自由元個數為s?sizs-sizs?siz。首先只含線性基中元素的非空子集不會有貢獻,然后對于任意自由元的子集,根據線性基的定義,都可以找到一個線性基的子集把它異或成000。
算GGG的過程中可能會爆ll,但反正最終答案在范圍內,溢出就溢出吧。
#include <iostream> #include <cstdio> #include <cstring> #include <cctype> using namespace std; typedef long long ll; int s,n; char t[100]; ll h[100],bas[100],f[100],ans; int col[100]; inline void insert(ll x) {for (int i=60;i>=0;i--)if (x&(1ll<<i))if (bas[i]) x^=bas[i];else return (void)(bas[i]=x); } void dfs(int k,int c) {if (k>n){ll d=0;for (int i=1,cnt=0;i<n;i++)for (int j=i+1;j<=n;j++,cnt++)if (col[i]!=col[j])d|=1ll<<cnt;memset(bas,0,sizeof(bas));for (int i=1;i<=s;i++) insert(h[i]&d);int cnt=0;for (int i=0;i<=60;i++) cnt+=(bas[i]>0);f[c]+=1ll<<s-cnt;return;}for (col[k]=1;col[k]<=c;col[k]++,dfs(k+1,c));col[k]++,dfs(k+1,c+1); } int main() {scanf("%d",&s);for (int i=1;i<=s;i++){scanf("%s",t);for (int j=strlen(t)-1;j>=0;j--) h[i]=(h[i]<<1)^(t[j]^48);}int len=strlen(t);for (n=1;n*(n-1)/2<len;n++);dfs(1,0);ll fac=1;for (int i=1;i<=n;fac*=i,i++) ans+=((i&1)? 1:-1)*fac*f[i];printf("%lld\n",ans);return 0; }總結
以上是生活随笔為你收集整理的【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drbd(一):简介和安装
- 下一篇: 常系数齐次线性递推学习笔记