bzoj 3136_异或校验图

bzoj 3136_异或校验图BZOJ4671:异或图

大家好,又见面了,我是你们的朋友全栈君。

传送门
直接求连通的不好做,考虑容斥
\(g_i\) 表示至少有 \(i\) 个连通块的方案数,\(f_i\) 表示恰好有 \(i\) 个的
那么
\[g_x=\sum_{i=x}^{n}\begin{Bmatrix}x \\ i\end{Bmatrix}f_i\iff f_x=\sum_{i=x}^{n}(-1)^{i-x}\begin{bmatrix}x \\ i\end{bmatrix}g_i\]
那么
\[f_1=\sum_{i=1}^{n}(-1)^{i-1}(i-1)!g_i\]
\(g\)
考虑枚举点的拆分,相当于是不同的集合之没有边,这部分直接用线性基求出方案

# include <bits/stdc++.h> using namespace std; typedef long long ll; int n = 1, graph[65][15][15], m, id[15]; char ch[2333]; ll fac[15], ans, bc[65], v; void Dfs(int x, int f) { register int i, j, k, tot, num; if (x > n) { memset(bc, 0, sizeof(bc)), num = 0; for (i = 1; i <= m; ++i) { for (v = tot = 0, j = 1; j <= n; ++j) for (k = j + 1; k <= n; ++k) if (id[j] != id[k]) v |= (ll)graph[i][j][k] << tot, ++tot; for (j = 0; j < tot; ++j) if (v >> j & 1) { if (!bc[j]) { bc[j] = v, ++num; break; } v ^= bc[j]; } } ans += (ll)((f & 1) ? 1 : -1) * fac[f - 1] * (1ll << (m - num)); return; } for (i = 1; i <= f + 1; ++i) id[x] = i, Dfs(x + 1, max(i, f)); } int main() { register int i, j, k, len, cnt; for (scanf("%d", &m), i = 1; i <= m; ++i) { scanf(" %s", ch + 1), len = strlen(ch + 1); while (n * (n - 1) / 2 < len) ++n; for (cnt = 0, j = 1; j <= n; ++j) for (k = j + 1; k <= n; ++k) graph[i][j][k] = ch[++cnt] - '0'; } for (fac[0] = 1, i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i; Dfs(1, 0), printf("%lld\n", ans); return 0; }

转载于:https://www.cnblogs.com/cjoieryl/p/10182369.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107117.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【用python编写一个简单的单线程wifi暴力破解工具】

    源代码a.txt:密码文件crack.py:wifi破解模块main.py:主模块scan.py:wifi扫描模块scan.pyimportpywifiimporttime#WiFi扫描模块defwifi_scan():#初始化wifiwifi=pywifi.PyWiFi()#使用第一个无线网卡interface=wifi.interfaces()[0]#开始扫描interface.scan()

    2022年4月9日
    47
  • traceroute的原理与使用

    traceroute的原理与使用traceroute,路由跟踪,用来跟踪一个分组从源点到终点的整个过程。原理分析traceroute是通过ICMP协议中的时间超时差错报告报文来实现的,他从源主机到目的主机发送一连串的IP数据报p1-pn,并且数据报是无法交付的udp数据报。第一个数据报的TTL设置为1,这样当这个数据报转发到第一个路由器的时候,路由器收到后TTL减1,减完1之后发现TTL变为0,路由器会向源主机发送一个超时差…

    2022年7月21日
    16
  • pycharm汉化版安装[通俗易懂]

    pycharm汉化版安装[通俗易懂]pycharm汉化版安装想要学好一门语言一款好用的编辑软件非常的重要,最近公司要做一款智能机器人的客服聊天系统,用到python刚开始使用eclipse编辑,发现效果不太理想,毕竟不是专业化软件。好了废话少说开启pycharm的安装之旅吧!一、首先呢当然是下载,不过呢我已经准备好了!赶快通过百度云下载吧,链接:百度云链接密码:32g6二、下载完成解压到自己想保存

    2022年5月25日
    45
  • 二叉树的5个重要性质「建议收藏」

    二叉树的5个重要性质「建议收藏」1.在二叉树的第i层上最多有2 i-1 个节点。(i>=1) 用归纳法证明:归纳基:i=1层时,只有一个根结点,          2i-1=20=1;归纳假设:假设i=k时,命题成立;归纳证明:二叉树上每个结点至多有两棵子树,则第k+1层的结点数最多为2k-12=2k+1-1。

    2022年5月31日
    45
  • Java中如何通过键盘输入一个数组

    Java中如何通过键盘输入一个数组有时候在编写Jave的时候需要键盘输入一个数组,本小白也是看了几篇博客后才知道了如何在自己的程序中进行键盘输入,废话不多说,直接上代码:第一种方法:(不限制输入数组的长度)System.out.println("请输入几个数并用逗号隔开:");Scannersc=newScanner(System.in);Stringstr=sc.next().toString();…

    2022年6月26日
    38
  • 【SpringBoot】35、SpringBoot整合Redis监听Key过期事件「建议收藏」

    【SpringBoot】35、SpringBoot整合Redis监听Key过期事件「建议收藏」在实际的开发项目中,监听key的过期事件,应用非常广泛,例如:订单超时未支付,优惠券过期等等一、修改Redis配置文件1、在Redis的安装目录2、找到redis.windows.conf文件,搜索“notify-keyspace-events”修改为“notify-keyspace-eventsEx”,这样我们的Redis就支持key过期事件的监听了二、注入redisMessageListenerContainer注意:本偏文章衔接与上篇文章:【Sprin

    2022年9月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号