LINK


思路

首先在加入几个点之后所有的点都只有三种状态

一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过

然后前两个状态是可以压缩起来的

因为我们只需要记录下当前独立集大小和是否被访问过,然后每次加点我们直接枚举加入独立集中的点然后周围联通的点都可以一起访问,只要保证当前枚举的点没有被访问过就可以了

因为这样选出来的当前的点一定是不是独立集中的且不和独立集联通的

然后每次因为加入了很多个点,我们设\(w_i\)表示和i联通(包括i)的所有点的集合

然后就可以用排列数算了,只需要保证当前选出来的加入独立集的点在所有其他点之前算就可以了

所以是\(dp_{i+1,s|w_{j}}+=dp_{i,s}*P_{n-cnt[s]-1}^{cnt[w_j\oplus(w_j\&s)]-1}\)


#include<bits/stdc++.h>

using namespace std;

const int Mod = 998244353;
const int N = 21; int n, m, w[N];
int fac[N], inv[N], cnt[1 << N];
int dp[N][1 << N]; int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
function<int(int a, int b)> add = [&](int a, int b) {
return (a += b) >= Mod ? a - Mod : a;
}; function<int(int a, int b)> sub = [&](int a, int b) {
return (a -= b) < 0 ? a + Mod : a;
}; function<int(int a, int b)> mul = [&](int a, int b) {
return (long long) a * b % Mod;
}; function<int(int a, int b)> fast_pow = [&](int a, int b) {
int res = 1;
for (; b; b >>= 1, a = mul(a, a))
if (b & 1) res = mul(res, a);
return res;
}; function<int(int a, int b)> P = [&](int a, int b) {
return (a < b) ? 0 : mul(fac[a], inv[a - b]);
}; scanf("%d %d", &n, &m);
int up = (1 << n) - 1;
for (int i = 1; i <= n; i++) w[i] = 1 << (i - 1);
for (int i = 1; i <= m; i++) {
int u, v; scanf("%d %d", &u, &v);
w[u] |= 1 << (v - 1);
w[v] |= 1 << (u - 1);
}
inv[0] = fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = mul(fac[i - 1], i);
inv[n] = fast_pow(fac[n], Mod - 2);
for (int i = n - 1; i >= 1; i--) inv[i] = mul(inv[i + 1], i + 1);
for (int i = 1; i <= up; i++) {
for (int j = 1; j <= n; j++) {
cnt[i] += (i >> (j - 1)) & 1;
}
}
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int s = 0; s <= up; s++) if (dp[i - 1][s]) {
for (int j = 1; j <= n; j++) if (!((s >> (j - 1)) & 1)) {
dp[i][s | w[j]] = add(dp[i][s | w[j]], mul(dp[i - 1][s], P(n - cnt[s] - 1, cnt[w[j] ^ (w[j] & s)] - 1)));
}
}
}
for (int i = n; i >= 1; i--) if (dp[i][up]) {
printf("%d", mul(dp[i][up], inv[n]));
break;
}
return 0;
}

LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】的更多相关文章

  1. loj2540 「PKUWC2018」随机算法 【状压dp】

    题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...

  2. LOJ2540「PKUWC2018」随机算法

    又是一道被咕了很久的题 貌似从WC2019之前咕到了现在 我们用f[i][s]表示现在最大独立集的大小为i 不可选集合为s 然后转移O(n)枚举加进来的点就比较简单啦 这个的复杂度是O(2^n*n^2 ...

  3. 【LOJ2540】「PKUWC2018」随机算法

    题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...

  4. 「PKUWC2018」随机算法

    题目 思博状压写不出是不是没救了呀 首先我们直接状压当前最大独立集的大小显然是不对的,因为我们的答案还和我们考虑的顺序有关 我们发现最大独立集的个数好像不是很多,可能是\(O(n)\)级别的,于是我们 ...

  5. 【LOJ】 #2540. 「PKUWC2018」随机算法

    题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...

  6. loj#2540. 「PKUWC2018」随机算法

    传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...

  7. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  8. LOJ2542. 「PKUWC2018」随机游走

    LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...

  9. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

随机推荐

  1. (转帖整理)Linux下的Autoconf和AutoMake(理论篇) 1

    在搜索网上资料过程中,这是感觉最简洁有效的一篇文章,特进行转帖记录,并根据情况对部分内容进行了修改.原帖传送门:Linux下的Autoconf和AutoMake 1.工具安装在开始使用autoconf ...

  2. Codeforces 349B - Color the Fence

    349B - Color the Fence 贪心 代码: #include<iostream> #include<algorithm> #include<cstdio& ...

  3. Java基础九--抽象类

    Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...

  4. Krapo 2

    The krpano Viewer is a small and very flexible high-performance viewer for all kind of panoramic ima ...

  5. thinkphp条件查询

    1.这是我在做项目的时候编写的: $profit = M('shipping_types',' ','DB_PROFIT');//没有表前缀,在M函数的第二个参数就为空. //条件$field = a ...

  6. POJ-1160 Post Office (DP+四边形不等式优化)

    题目大意:有v个村庄成直线排列,要建设p个邮局,为了使每一个村庄到离它最近的邮局的距离之和最小,应该怎样分配邮局的建设,输出最小距离和. 题目分析:定义状态dp(i,j)表示建设 i 个邮局最远覆盖到 ...

  7. 通过SVN获取变更列表,得到对应的最新class

    通过本地SVN获得未提交的文件列表获取工程中最新的class的方式参考: 增量部署代码利用批处理命令按原始结构复制指定的文件 新写了一个增强版,根据已提交至SVN的代码loglist,获取最新的cla ...

  8. turbine源码分析

    turbine源码分析 1.turbine架构设计 一切从InstanceDiscovery模块开始,该模块提供所有的主机信息.它会定期的发送更新,ConnectionManager负责创建连接到主机 ...

  9. zabbix自动化监控基础

    zabbix安装配置文档 2 一 zabbix-server 安装配置(基础配置) 2 二 zabbix agent安装配置 5 2.1 主动模式和被动模式 6 2.2 安装配置zabbix_agen ...

  10. zk请求和响应对

    zk的请求和响应是通过id对应上的: 请求头(RequestHeader)和响应头(ReplyHeader)共用一个xid,它的本质是ClientCnxn类中的一个计数器. 1. 首先看客户端: Pa ...