【BZOJ4671】(斯特林反演)
题目
【BZOJ4671】异或图
很有意思的题
做法
直接处理显然很难,我们考虑范围扩大以求容斥或反演这类的帮助
\(f_i\)表示至少有\(i\)个联通块的方案,形如设立\(i\)个联通块轮廓,联通块内连边随意,联通块与联通块之间无连边
\(g_i\)表示恰好有\(i\)个联通块的方案,形如设立\(i\)个联通块轮廓,在保证内部联通的情况下,外部块与块间无连边
显然:$$f_x=\sum\limits_{i=x}^n\begin{Bmatrix}i\x\end{Bmatrix}g_i$$
根据斯特林反演:$$g_x=\sum\limits_{i=x}^n (-1)^{i-x}\begin{bmatrix}i\x\end{bmatrix}f_i$$
故\(g_1=\sum\limits_{i=1}^n (-1)^{i-1}\begin{bmatrix}i\\1\end{bmatrix}f_i\)
而\(\begin{bmatrix}i\\1\end{bmatrix}\)是阶乘形式:\(\begin{bmatrix}i\\1\end{bmatrix}=(i-1)!\)
化简答案为:\(g_1=\sum\limits_{i=1}^n (-1)^{i-1}(i-1)!f_i\)
考虑\(f_i\)如何求出:状压点所属联通块状态,则我们要选择图集使块与块之间无边,考虑枚举每个图的\(S\)表示点与点之间的连边(不属同一联通块),我们压到线性基里去,\(ele\)表示线性基元素,这些元素是不能选择的(相异),故答案为\(2^{N-ele}\)
Code
#include<bits/stdc++.h>
typedef int LL;
const LL maxn=109;
LL N,n;
LL G[maxn][maxn][maxn],a[maxn];
char s[maxn];
long long ans,p[maxn],S,fac[15];
void Dfs(LL x,LL up){
if(x==n+1){
memset(p,0,sizeof(p)); LL ele(0);
for(LL i=1;i<=N;++i){
S=0; LL tot(0);
for(LL j=1;j<=n;++j)
for(LL k=j+1;k<=n;++k)
if(a[k]!=a[j]){
S|=(1ll<<tot)*G[i][j][k];
++tot;
}
for(LL j=0;j<tot;++j){
if(S&(1ll<<j)){
if(!p[j]){
p[j]=S;
++ele;
break;
}else
S^=p[j];
}
}
}
ans+=1ll*((up&1)?1:-1)*fac[up-1]*(1ll<<N-ele);
return;
}
for(LL i=1;i<=up+1;++i){
a[x]=i;
Dfs(x+1,std::max(up,i));
}
}
int main(){
scanf("%d",&N);
for(LL i=1;i<=N;++i){
scanf(" %s",s+1);
LL len(strlen(s+1));
if(!n){
n=1;
for(;n*(n-1)/2!=len;++n);
}
LL now(0);
for(LL j=1;j<=n;++j) for(LL k=j+1;k<=n;++k) G[i][j][k]=s[++now]-'0';
}
fac[0]=fac[1]=1; for(LL i=2;i<=n;++i) fac[i]=fac[i-1]*i;
Dfs(1,0);
printf("%lld",ans);
return 0;
}
【BZOJ4671】(斯特林反演)的更多相关文章
- bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...
- 【BZOJ4671】异或图(斯特林反演)
[BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- 【bzoj4671】异或图(容斥+斯特林反演+线性基)
传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...
- Square(斯特林反演)
题意 给出一个 \(n × m\) 大小的矩形,每个位置可以填上 \([1, c]\) 中的任意一个数,要求填好后任意两行互不等价且任意两列互不等价,两行或两列等价当且仅当对应位置完全相同,求方案数 ...
- bzoj 4671 异或图——容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...
- bzoj 4671 异或图 —— 容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 首先,考虑容斥,就是设 \( t[i] \) 表示至少有 \( i \) 个连通块的方 ...
- TCO14 Wildcard CountTables——斯特林反演
不知道咕了多长时间的题... 讲了3遍,还是自己搞懂了.. 暂时没有找到题目链接 题意: n×m的网格,每个格子填[1,x]的数,使得不存在两行两列同构. 先保证一个,行相同. 再容斥掉列. 枚举至多 ...
- 斯特林数&斯特林反演
第一类斯特林数 定义 第一类Stirling数\(s(n,m)\),也可记为\(\begin{bmatrix}n\\m\end{bmatrix}\). 第一类Stirling分为无符号第一类Stirl ...
随机推荐
- 再谈Unity调用Android的Activity
这段时间在研究Unity4.3开发环境下.怎样调用由Android SDK4.4.2写的Activity.參考了非常多网上的博客.百度出了几十篇大部分都是转载雨松MOMO的,这里必须向雨松MOMO表示 ...
- WPF之路——用户控件对比自定义控件UserControl VS CustomControl)
将多个现有的控件组合成一个可重用的“组”. 由一个XAML文件和一个后台代码文件. 不能使用样式和模板. 继承自UserControl类. 自定义控件(扩展) 在现有的控件上进行扩展,增加一些新的属性 ...
- 2015InfoQ软件大会技术记录
前述 参加infoq软件大会,最大的感触就是,互联网行业的技术发展日新月异:由市场痛点.用户痛点.开发痛点所驱动的技术变革更是遍地开花.新的技术新的思维也是层出不穷:大会中频频提到的高扩展高可用架构. ...
- Python 个人常用汇总
Python 常用文件操作总结: 导入库路径:sys.path.append('/usr/local/lib/python2.7/site-packages') from random import ...
- 简单的php基于curl的反向代理程序
起因: 经理:需要实现一个反向代理? 我: 简单,nginx分分钟配置好. 经理:嗯?没有nginx? 我: nodejs也行啊,网上有例子分分钟搞定. 经理:嗯?只有虚拟主机,只能上传php程序? ...
- Java知识点梳理——继承
1.定义:继承允许创建分等级层次的类,就是子类继承父类的特征行为,使得子类对象具有父类实例的方法, 使得子类具有父类相同的行为. 2.继承的特性: a.子类拥有父类非priavte的属性.方法: ...
- 【BZOJ4712】洪水 树链剖分优化DP+线段树
[BZOJ4712]洪水 Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为 ...
- 记录--常用的linux命令
mysql event /*查询event是否开启(查询结果Off为关闭 On为开启)*/ show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/ se ...
- python小知识点复习
join 与 split 对应,join传入的列表只包含字符串卡类型 字典 dic = {'x':1, 'y':2, 'x':3} print(dic) # {'x': 3, 'y': 2} 重复的k ...
- sql server代理系列
https://www.cnblogs.com/woodytu/tag/SQL%20Server%E4%BB%A3%E7%90%86/ SQL Server代理(12/12):多服务器管理 Woody ...