题解

看了一眼觉得是求出图对图统计完美匹配的个数(可能之前做过这样模拟题弃疗了,一直心怀恐惧。。。

然后说是统计一下每种匹配出现的概率,也就是,当前左边点匹配状态为S,右边点匹配状态为T,每种匹配出现的概率的总和作为\(f[S][T]\),我们需要的就是\(f[2^{n} - 1][2^{n} - 1]\)

然而,会发现转移起来似乎非常麻烦,例如,假如两条边一起出现,各自匹配出现的概率是多少?

我们把每组边拆开,变成每条边在匹配中有50%概率出现,一组边同时在匹配中出现的概率是25%,如果t = 2,那么概率就是-25%

为什么呢,对于t = 1的边,两条肯定一起出现,那么如果我们算第一条边进入匹配,概率是50%,算第二条边进入匹配,概率也是50%,但是由于两条边一起出现的特殊性质,我们按照这个方法算,如果两个匹配都出现的概率是25%,但是两条匹配都出现的概率是50%,我们就加上一个25%两条边一起匹配

同理,对于t = 2的边,第一条边进去匹配是50%,第二条边进入匹配是50%,然而两条边一起进入匹配是不可能的,只有减掉那25%的概率了

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <map>
  8. //#define ivorysi
  9. #define pb push_back
  10. #define space putchar(' ')
  11. #define enter putchar('\n')
  12. #define mp make_pair
  13. #define pb push_back
  14. #define fi first
  15. #define se second
  16. #define mo 974711
  17. using namespace std;
  18. typedef long long int64;
  19. typedef double db;
  20. template<class T>
  21. void read(T &res) {
  22. res = 0;char c = getchar();T f = 1;
  23. while(c < '0' || c > '9') {
  24. if(c == '-') f = -1;
  25. c = getchar();
  26. }
  27. while(c >= '0' && c <= '9') {
  28. res = res * 10 + c - '0';
  29. c = getchar();
  30. }
  31. res *= f;
  32. }
  33. template<class T>
  34. void out(T x) {
  35. if(x < 0) {putchar('-');x = -x;}
  36. if(x >= 10) {
  37. out(x / 10);
  38. }
  39. putchar('0' + x % 10);
  40. }
  41. const int MOD = 1000000007;
  42. int N,M,tot,fir[(1 << 15) + 1];
  43. struct Edge{
  44. int a[2],b[2],val;
  45. }E[10005];
  46. vector<int> MK[20];
  47. map<int,int> f[(1 << 15) + 5];
  48. int fpow(int x,int c) {
  49. int res = 1,t = x;
  50. while(c) {
  51. if(c & 1) res = 1LL * res * t % MOD;
  52. t = 1LL * t * t % MOD;
  53. c >>= 1;
  54. }
  55. return res;
  56. }
  57. void Init() {
  58. read(N);read(M);
  59. int t,a0,a1,b0,b1;
  60. int Inv2 = (MOD + 1) / 2,Inv4 = 1LL * Inv2 * Inv2 % MOD;
  61. for(int i = 1 ; i <= M ; ++i) {
  62. read(t);read(a0);read(b0);
  63. if(t == 0) {
  64. E[++tot].a[0] = a0;E[tot].b[0] = b0;E[tot].val = Inv2;
  65. MK[a0].pb(tot);
  66. }
  67. else {
  68. read(a1);read(b1);
  69. E[++tot].a[0] = a0;E[tot].b[0] = b0;E[tot].val = Inv2;MK[a0].pb(tot);
  70. E[++tot].a[0] = a1;E[tot].b[0] = b1;E[tot].val = Inv2;MK[a1].pb(tot);
  71. E[++tot].a[0] = a0;E[tot].b[0] = b0;E[tot].a[1] = a1;E[tot].b[1] = b1;E[tot].val = Inv4;
  72. MK[a0].pb(tot);MK[a1].pb(tot);
  73. if(t == 2) E[tot].val = MOD - Inv4;
  74. }
  75. }
  76. }
  77. void update(int &x,int y) {
  78. x += y;
  79. while(x >= MOD) x -= MOD;
  80. }
  81. void Solve() {
  82. fir[0] = 1;
  83. for(int i = 1 ; i < (1 << N) ; ++i) {
  84. fir[i] = min(fir[i >> 1] + 1,(i & 1) ? N + 1 : 1);
  85. }
  86. f[0][0] = 1;
  87. for(int S = 0 ; S < (1 << N) ; ++S) {
  88. for(auto k : f[S]) {
  89. int T = k.fi,val = k.se;
  90. //printf("%d %d %d\n",S,T,val);
  91. for(auto id : MK[fir[S]]) {
  92. if(T >> (E[id].b[0] - 1) & 1) continue;
  93. if(S >> (E[id].a[0] - 1) & 1) continue;
  94. if(E[id].a[1]) {
  95. if(E[id].a[0] == E[id].a[1] || E[id].b[0] == E[id].b[1]) continue;
  96. if(T >> (E[id].b[1] - 1) & 1) continue;
  97. if(S >> (E[id].a[1] - 1) & 1) continue;
  98. int a0 = E[id].a[0] - 1,a1 = E[id].a[1] - 1;
  99. int b0 = E[id].b[0] - 1,b1 = E[id].b[1] - 1;
  100. update(f[S | (1 << a0) | (1 << a1)][T | (1 << b0) | (1 << b1)],1LL * val * E[id].val % MOD);
  101. }
  102. else {
  103. int a0 = E[id].a[0] - 1,b0 = E[id].b[0] - 1;
  104. update(f[S | (1 << a0)][T | (1 << b0)],1LL * val * E[id].val % MOD);
  105. }
  106. }
  107. }
  108. }
  109. int ans = 1LL * fpow(2,N) * f[(1 << N) - 1][(1 << N) - 1] % MOD;
  110. out(ans);enter;
  111. }
  112. int main() {
  113. #ifdef ivorysi
  114. freopen("f1.in","r",stdin);
  115. #endif
  116. Init();
  117. Solve();
  118. return 0;
  119. }

【LOJ】#2290. 「THUWC 2017」随机二分图的更多相关文章

  1. @loj - 2290@ 「THUWC 2017」随机二分图

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个左右各 n 个点的二分图,图中的边会按照一定的规律随机出现. ...

  2. 「THUWC 2017」随机二分图

    「THUWC 2017」随机二分图 解题思路 : 首先有一个 \(40pts\) 的做法: 前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \ ...

  3. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

  4. @loj - 2289@「THUWC 2017」在美妙的数学王国中畅游

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点编号 0 到 n-1,每个点有一个从 [0,1] 映射到 ...

  5. @loj - 2288@「THUWC 2017」大葱的神力

    目录 @description@ @solution@ @data - 1@ @data - 2@ @data - 3@ @data - 4@ @data - 5@ @data - 6@ @data ...

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

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

  7. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  8. 「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT&泰勒展开

    题目大意: 传送门 给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$.$f(x)=e^{ax+b}$.$f(x)=ax+b$中的一个. 支持删边连边,修改节点上函数的操作. 每次 ...

  9. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游

    题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...

随机推荐

  1. js截取字符串substr和substring的区别

    定义substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符.substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法substr()        str ...

  2. R6—单变量正态性检验

    方法不唯一 单变量正态检验主要的话包括以下这些 shapiro.test();#Shapiro-Wilk检验 library("nortest"); lillie.test() # ...

  3. bzoj1485 有趣的数列

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1485 [题解] Catalan数,注意不能直接用逆元,需要分解质因数. # include ...

  4. Concat层解析

    Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9 ...

  5. Django-数据库增查

    1/ python manage.py shell ---------一般用于调试操作 2/ 建表--定义类 #产品表 class ProductModel(models.Model): #通过类属性 ...

  6. js数据类型隐式转换问题

    js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...

  7. “榕树下·那年”移动app ( hybrid ) 开发总结

        榕树下网站本身的技术人员并不多,所以app开发的任务就到了母公司盛大文学这边.       盛大文学无线业务中心负责这次具体开发任务.       一如既往的,开发的情况是:时间紧,任务重,人 ...

  8. python pachong zhuanzai

    come from:http://www.cnblogs.com/dyllove98/archive/2013/07/12/3187186.html 先来说一下我们学校的网站: http://jwxt ...

  9. perl6 Net::HTTP 发送任意 url 请求例子

    只做个笔记, 用 HTTP::UserAgent 的话, url 中有特殊点的符号会请求不了, 用 Net::HTTP 能很好的发送请求. use Net::HTTP::GET; my $url = ...

  10. 阿里面试回来,想和Java程序员谈一谈

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...