题意:给定图,随机一个排列,依次加点,如果加点之后不是独立集就不加。求最后得到一个最大独立集的概率。

解:就是求有多少个排列可以加出最大独立集。

显然有一个3n的状压DP,0表示没加,1表示没加上,2表示加上了。

转移的时候枚举下一个加哪个点即可。这样有30分。

然后还是过不了的。考虑怎么压成二进制。我们可以用1表示这个点不能加(与某个加入的点相邻或者已经加入),0表示这个点可以加。

这样会损失一个信息,你就不知道当前独立集多大。所以再开一维表示独立集大小。

每次转移的时候考虑加哪一个点。顺便把它相邻的点也加上。注意它相邻的点加入的时候有顺序。具体来说,我们之前的状态中如果有x个点,那么就还有n - x个空位。而其中最前面的一个空位肯定是你主动加进去的点。所以现在要在n - x - 1个空位中放进被动加进去的点。这就是一个排列数。

然后就有了一个n2n的DP了。注意预处理出与一个点相邻的点和一个状态中点的个数。

 #include <cstdio>

 typedef long long LL;
const int N = ;
const LL MO = ; struct Edge {
int nex, v;
}edge[N * N * ]; int top; int n, e[N], cnt[ << ], nb[N];
LL f[N][ << ], nn[N], inv[N], invn[N];
bool vis[N]; inline void add(int x, int y) {
top++;
edge[top].v = y;
edge[top].nex = e[x];
e[x] = top;
return;
} inline void out(int x) {
for(int i = ; i < n; i++) {
printf("%d", (x >> i) & );
}
return;
} inline LL C(int n, int m) {
return nn[n] * invn[m] % MO * invn[n - m] % MO;
}
inline LL P(int n, int m) {
if(m > n) {
return ;
}
return nn[n] * invn[n - m] % MO;
} int main() {
int m;
scanf("%d%d", &n, &m);
for(int i = , x, y; i <= m; i++) {
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
int lm = ( << n);
for(int s = ; s < lm; s++) {
cnt[s] = + cnt[(s - (s & (-s))) >> ];
}
for(int x = ; x < n; x++) {
nb[x] = << x;
for(int i = e[x + ]; i; i = edge[i].nex) {
int y = edge[i].v - ;
nb[x] |= ( << y);
}
}
nn[] = inv[] = invn[] = ;
nn[] = inv[] = invn[] = ;
for(int i = ; i <= n; i++) {
nn[i] = nn[i - ] * i % MO;
inv[i] = inv[MO % i] * (MO - MO / i) % MO;
invn[i] = invn[i - ] * inv[i] % MO;
} int ans = ;
LL sum = ;
f[][] = vis[] = ;
for(int i = ; i <= n && vis[i]; i++) {
for(int s = ; s < lm; s++) {
// f[i][s]
if(!f[i][s]) {
continue;
}
//printf("f %d ", i); out(s); printf(" = %lld \n", f[i][s]);
if(i > ans) {
ans = i;
sum = f[i][s];
}
else if(i == ans) {
sum = (sum + f[i][s]) % MO;
}
for(int j = ; j < n; j++) {
if((s >> j) & ) {
continue;
}
int t = s | nb[j];
// f[i + 1][t]
(f[i + ][t] += f[i][s] * P(n - cnt[s] - , cnt[t] - cnt[s] - ) % MO) %= MO;
vis[i + ] = ;
//printf("f %d ", i + 1); out(t); printf(" += f %d ", i); out(s); printf(" * %lld \n", P(n - cnt[s] - 1, cnt[t] - cnt[s] - 1));
}
}
} printf("%lld\n", sum * invn[n] % MO);
//printf("%d %lld \n", ans, sum);
return ;
}

AC代码

LOJ#2540 随机算法的更多相关文章

  1. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  2. [PKUWC2018]随机算法

    题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...

  3. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

  4. POJ 3318 Matrix Multiplication(随机算法)

    题目链接 随机算法使劲水...srand((unsigned)time(0))比srand(NULL)靠谱很多,可能是更加随机. #include <cstdio> #include &l ...

  5. 抽奖随机算法的技术探讨与C#实现

    一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...

  6. hdu 4712 (随机算法)

    第一次听说随机算法,在给的n组数据间随机取两个组比较,当随机次数达到一定量时,答案就出来了. #include<stdio.h> #include<stdlib.h> #inc ...

  7. 权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  8. hdu 4712 Hamming Distance ( 随机算法混过了 )

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  9. HDU4712+随机算法

    随机算法 求n个20位的2进制串的MinDist. Dist:两个串的异或结果中1的个数 /* 随机算法 */ #include<algorithm> #include<iostre ...

随机推荐

  1. WPF编程 ,TextBlock 显示百分数值的一种简单方法。

    原文:WPF编程 ,TextBlock 显示百分数值的一种简单方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...

  2. 五、MYSQL的索引

    对于建立的索引(姓,名字,data) 5.1.索引对一下的查询类型有效 1.全值匹配:能查找姓+名为ALLEN.出生日期为1990-11-05的人: 2.最左前缀匹配:可以查找姓为ALLEN的人:即只 ...

  3. python3获取主机名、主机IP

    python3可以通过socket模块获取主机名及主机IP 代码如下: *********************************************************** 学习永远 ...

  4. springmvc 结合 自动封装异常信息输出为json 报错 500内部服务器错误的原因

    补充:还有一个原因是因为spring的对象没有被成功注入,例如 mapper没有被成功注入,抛出异常时在这种封装场景下将会抛出 500 服务器内部错误, 这种情况下要排查还是靠debug然后看看到底是 ...

  5. ES6 之reduce的高级技巧

    reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值.reduce() 方法接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 ...

  6. 第二十九章 springboot + zipkin + mysql

    zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...

  7. [转]JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  8. vue初学实践之路——vue简单日历组件(2)

    上一篇我们已经实现了基本的日历显示功能,这一次我们要加上预定的功能 废话不多说,上代码 <div id="calendar"> <!-- 年份 月份 --> ...

  9. EF Core 新特性——Owned Entity Types

    Owned Entity Types 首先owned entity type是EF Core 2.0的新特性. 至于什么是owned entity types,可以先把他理解为EF Core官方支持的 ...

  10. 数据中心网络(1)-VXLAN

    想写个DC系列的文章,站在传统路由交换网络基础上谈谈数据中心网络,一方面是给自己的学习做下总结,另一方面也想分享一些东西. 谈到数据中心网络,能想到的东西无非就VXLAN.SDN.NFV.EVPN这些 ...