[BZOJ4671]异或图 线性基+stirling反演
2018-01-20 19:15
183 查看
联通图计数一般都是容斥。。。
首先设F(M)为至少M个联通块的图的个数,G(M)为恰好M个联通块的图的个数,那么有:
F(M)=∑i=MN{iM}G(i)
根据stirling反演有:
G(M)=∑i=MN(−1)i−M[iM]F(i)
我们要求G(1),就是
G(1)=∑i=1N(−1)i−1(i−1)!F(i)
也就是对于M个联通块的图,其贡献为(−1)M−1(M−1)!。
现在考虑计算F(M),花费贝尔数的时间来枚举子集划分,也就是不同集合不能连边,相同集合随意。对于一条跨越不同集合边,把每个图看成一个二进制位,若该图存在这条边则为1,否则为0,所有图合成一个二进制串,最后就是询问很多二进制串异或为0的子集个数,线性基即可。
复杂度O(Bnn2s)。
代码:
首先设F(M)为至少M个联通块的图的个数,G(M)为恰好M个联通块的图的个数,那么有:
F(M)=∑i=MN{iM}G(i)
根据stirling反演有:
G(M)=∑i=MN(−1)i−M[iM]F(i)
我们要求G(1),就是
G(1)=∑i=1N(−1)i−1(i−1)!F(i)
也就是对于M个联通块的图,其贡献为(−1)M−1(M−1)!。
现在考虑计算F(M),花费贝尔数的时间来枚举子集划分,也就是不同集合不能连边,相同集合随意。对于一条跨越不同集合边,把每个图看成一个二进制位,若该图存在这条边则为1,否则为0,所有图合成一个二进制串,最后就是询问很多二进制串异或为0的子集个数,线性基即可。
复杂度O(Bnn2s)。
代码:
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; int s,n,c[11],sz; bool e[65][11][11]; ll fac[11],lb[65],ans=0; int read() { char ch; for(ch=getchar();ch<'0'||ch>'1';ch=getchar()); return ch-'0'; } void dfs(int v,int m) { if(v>n) { sz=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(c[i]!=c[j]) { ll tmp=0; for(int k=1;k<=s;k++) if(e[k][i][j]) tmp|=(1ll<<(k-1)); for(int k=1;k<=sz;k++) if((tmp^lb[k])<tmp) tmp^=lb[k]; if(tmp) lb[++sz]=tmp; } ans+=fac[m]*(1ll<<(s-sz)); return; } for(int i=1;i<=m+1;i++) c[v]=i,dfs(v+1,m+(i>m)); } int main() { scanf("%d",&s); char t[60]; scanf("%s",t+1); int len=strlen(t+1),top=0; for(;n*(n-1)/2<len;n++); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) e[1][i][j]=t[++top]-'0'; for(int k=2;k<=s;k++) for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) e[k][i][j]=read(); fac[1]=1; for(int i=2;i<=n;i++) fac[i]=fac[i-1]*(1-i); dfs(1,0); printf("%lld",ans); return 0; }
相关文章推荐
- bzoj 4671: 异或图 容斥+斯特林反演+线性基
- bzoj 4671: 异或图
- BZOJ 4671 异或图 | 线性基 容斥 DFS
- bzoj 4671: 异或图
- [bzoj4671]异或图
- 【BZOJ】4671: 异或图
- [BZOJ 4671]异或图
- 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演
- 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演
- bzoj 4815: [Cqoi2017]小Q的表格 分块+莫比乌斯反演
- BZOJ 翻硬币-(异或和)
- BZOJ 3689 异或之
- 【bzoj3689】异或之 可持久化Trie树+堆
- 【数论】【枚举】【莫比乌斯反演】【线性筛】bzoj2818 Gcd
- [BZOJ1923][SDOI2010]外星千足虫(高斯消元---异或方程组)
- BZOJ 3261 最大异或和
- [莫比乌斯反演] BZOJ 1101 [POI2007]Zap
- 【BZOJ2460】元素(BJOI2011)-异或线性基+贪心
- 莫比乌斯反演例题(双解):bzoj 2045(Mobius)
- bzoj 2820: YY的GCD (反演)