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

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

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

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

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

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

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

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

  1. #include <cstdio>
  2.  
  3. typedef long long LL;
  4. const int N = ;
  5. const LL MO = ;
  6.  
  7. struct Edge {
  8. int nex, v;
  9. }edge[N * N * ]; int top;
  10.  
  11. int n, e[N], cnt[ << ], nb[N];
  12. LL f[N][ << ], nn[N], inv[N], invn[N];
  13. bool vis[N];
  14.  
  15. inline void add(int x, int y) {
  16. top++;
  17. edge[top].v = y;
  18. edge[top].nex = e[x];
  19. e[x] = top;
  20. return;
  21. }
  22.  
  23. inline void out(int x) {
  24. for(int i = ; i < n; i++) {
  25. printf("%d", (x >> i) & );
  26. }
  27. return;
  28. }
  29.  
  30. inline LL C(int n, int m) {
  31. return nn[n] * invn[m] % MO * invn[n - m] % MO;
  32. }
  33. inline LL P(int n, int m) {
  34. if(m > n) {
  35. return ;
  36. }
  37. return nn[n] * invn[n - m] % MO;
  38. }
  39.  
  40. int main() {
  41. int m;
  42. scanf("%d%d", &n, &m);
  43. for(int i = , x, y; i <= m; i++) {
  44. scanf("%d%d", &x, &y);
  45. add(x, y);
  46. add(y, x);
  47. }
  48. int lm = ( << n);
  49. for(int s = ; s < lm; s++) {
  50. cnt[s] = + cnt[(s - (s & (-s))) >> ];
  51. }
  52. for(int x = ; x < n; x++) {
  53. nb[x] = << x;
  54. for(int i = e[x + ]; i; i = edge[i].nex) {
  55. int y = edge[i].v - ;
  56. nb[x] |= ( << y);
  57. }
  58. }
  59. nn[] = inv[] = invn[] = ;
  60. nn[] = inv[] = invn[] = ;
  61. for(int i = ; i <= n; i++) {
  62. nn[i] = nn[i - ] * i % MO;
  63. inv[i] = inv[MO % i] * (MO - MO / i) % MO;
  64. invn[i] = invn[i - ] * inv[i] % MO;
  65. }
  66.  
  67. int ans = ;
  68. LL sum = ;
  69. f[][] = vis[] = ;
  70. for(int i = ; i <= n && vis[i]; i++) {
  71. for(int s = ; s < lm; s++) {
  72. // f[i][s]
  73. if(!f[i][s]) {
  74. continue;
  75. }
  76. //printf("f %d ", i); out(s); printf(" = %lld \n", f[i][s]);
  77. if(i > ans) {
  78. ans = i;
  79. sum = f[i][s];
  80. }
  81. else if(i == ans) {
  82. sum = (sum + f[i][s]) % MO;
  83. }
  84. for(int j = ; j < n; j++) {
  85. if((s >> j) & ) {
  86. continue;
  87. }
  88. int t = s | nb[j];
  89. // f[i + 1][t]
  90. (f[i + ][t] += f[i][s] * P(n - cnt[s] - , cnt[t] - cnt[s] - ) % MO) %= MO;
  91. vis[i + ] = ;
  92. //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));
  93. }
  94. }
  95. }
  96.  
  97. printf("%lld\n", sum * invn[n] % MO);
  98. //printf("%d %lld \n", ans, sum);
  99. return ;
  100. }

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. 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    20155308<信息安全系统设计基础 嵌入式C语言课堂考试补博客 知识点 置位 ?bits = bits | (1 << 7) ; /* sets bit 7 */ bits |= ...

  2. SQL Server 启动时发生错误1069:由于登录失败而无法启动

    解决方法:    (1). 我的电脑--控制面板--管理工具--服务--右键MSSQLSERVER--属性--登陆--登陆身份--选择"本地系统帐户".    (2). 我的电脑- ...

  3. [FQ]Tor + Chrome + PAC 尝试 FQ

    记录一次比较成功的FQ经历 1.从Tor官网下载最新的Tor browser,速度较慢可以从文末给出的链接中下载. 2.安装Tor browser. 3. Tor网络设置 3.1 那个描述与你的情况最 ...

  4. C指针乱谈(1)

    写了几年的C指针几乎没怎么用过,因为感觉没什么用.不过在听了一位老师讲课之后,我改变的我的想法. 在此稍做总结,希望能帮到一些和我有同样想法的人,希望看完这篇文章后能改变您的想法. 首先,说说概念,指 ...

  5. 【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

    实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart  难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install ...

  6. jenkis +sonarqube 对后端代码静态扫描,钉钉群通知执行结果(记录)

    代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知. 牵涉到配置: 1.配置sonar测试任务 ...

  7. okhttp3.4.1+retrofit2.1.0实现离线缓存

    关于Retrofit+OkHttp的强大这里就不多说了,还没了解的同学可以自行去百度.这篇文章主要讲如何利用Retrofit+OkHttp来实现一个较为简单的缓存策略:即有网环境下我们请求数据时,如果 ...

  8. Js_闭包跟作用域

    作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...

  9. 面向 Photoshop 的英特尔® Texture Works 插件

    英特尔对 Photoshop* 进行了扩展,以通过插件充分利用最新的图像压缩方法 (BCn/DXT).该插件旨在为图形工作者提供一款获取卓越压缩结果的工具,并提高 Photoshop* 中的压缩速度. ...

  10. UE4官方行为树快速入门文档解析和修改

    近学习了UE4官方文档的行为树快速入门指南,发现里面的部分逻辑稍稍有点混乱和重叠,于是加入了自己的想法,修改了部分行为树逻辑,优化了其AI寻路能力. 初始的基本操作和资源创建同官方文档一样:1个Fol ...