bzoj 4770 图样 - 概率与期望 - 动态规划
考虑求最大异或生成树的分治做法,每次按最高位分成$V_0,V_1$两个集合(如果不行,那么这一层就不管)。
然后再中间选一条最小边连接两个集合。两个集合分别再分治下去。
现在我们希望求到中间这条最小边的边权的期望。
直接求不好求,考虑换个方式统计。
设$h_{n,m,bit,lim}$表示在第$bit + 1$位将图分成$X,Y$两个集合,其中$|X| = n, |Y| = m$,两个集合间的所有边的边权都大于等于$lim$的方案数(或概率)。
转移的时候讨论一下
- $lim$在第$bit$位为0
- 如果$X,Y$中的点在$bit$位,一个集合中全为0,另一个集合中全为1,那么剩下的位可以任意填。
- 否则枚举$X,Y$中分别有多少个点在第$bit$位为1,然后将集合又分为$X_0, X_1, Y_0, Y_1$,显然最小边连在$X_0, Y_0$之间或者$X_1,Y_1$之间,这是一个子问题,可以通过这个子问题的答案转移,再乘上组合数。
- $lim$在第$bit$位为1
- 此时$X,Y$中的点在$bit$位一定满足一个集合中全为0,另一个集合中全为1,直接通过它转移。
统计期望或每种情况的边权和的时候做一个和就求出来了。
设$f_{i, j}$表示有一个$i$个点的完全图,每个点的权值是$[0, 2^{j})$中的随机整数时的所有方案的答案和。
显然能通过枚举$X_1$集合的大小来转移。
复杂度令人绝望(据说常数小就能卡过去)。但是$n,m$都比较小,打个表交上去就过了。
Code
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
typedef bool boolean; const int N = , M = , S = << M;
const int Mod = ; int add(int a, int b) {
return ((a += b) >= Mod) ? (a - Mod) : (a);
} int sub(int a, int b) {
return ((a -= b) < ) ? (a + Mod) : (a);
} int mul(int a, int b) {
return a * 1ll * b % Mod;
} int qpow(int a, int p) {
int pa = a, rt = ;
for ( ; p; p >>= , pa = mul(pa, pa))
if (p & )
rt = mul(rt, pa);
return rt;
} int inv(int a, int n) {
return qpow(a, n - );
} int n, m;
int f[N][N];
int comb[N][N];
int pow2[N * M];
int h[N][N][M][S]; inline void init() {
scanf("%d%d", &n, &m);
comb[][] = ;
for (int i = ; i <= n; i++) {
comb[i][] = comb[i][i] = ;
for (int j = ; j < i; j++)
comb[i][j] = add(comb[i - ][j - ], comb[i - ][j]);
}
pow2[] = ;
for (int i = ; i <= (n + ) * (m + ) + ; i++)
pow2[i] = add(pow2[i - ], pow2[i - ]);
} int dp(int n, int m, int bit, int lim) {
if (!bit)
return !lim;
if (!n || !m)
return pow2[(n + m) * bit];
int& rt = h[n][m][bit][lim];
if (~rt)
return rt;
if ((lim >> (bit - )) & ) {
rt = dp(n, m, bit - , lim ^ ( << (bit - )));
rt = add(rt, rt);
} else {
rt = pow2[(n + m) * (bit - ) + ];
for (int x = ; x <= n; x++)
for (int y = ; y <= m; y++) {
if ((!x && y == m) || (!y && x == n))
continue;
int a = dp(x, y, bit - , lim);
int b = dp(n - x, m - y, bit - , lim);
rt = add(rt, mul(mul(a, b), mul(comb[n][x], comb[m][y])));
}
}
return rt;
} int g(int n, int m, int bit) {
int rt = ;
for (int i = ; i < pow2[bit]; i++)
rt = add(rt, dp(n, m, bit, i));
// cerr << n << " " << m << " " << rt << " " << bit << '\n';
return rt;
} inline void solve() {
memset(h, -, sizeof(h));
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++) {
int& val = f[i][j];
val = add(f[i][j - ], f[i][j - ]);
for (int cnt = , tmp; cnt < i; cnt++) {
tmp = mul(f[cnt][j - ], pow2[(i - cnt) * (j - )]);
tmp = add(tmp, mul(f[i - cnt][j - ], pow2[cnt * (j - )]));
tmp = add(tmp, g(cnt, i - cnt, j - ));
tmp = add(tmp, pow2[(i + ) * (j - )]);
// printf("tmp %d %d %d= %d\n", i, j, cnt, tmp);
val = add(val, mul(tmp, comb[i][cnt]));
}
// printf("f[%d][%d] = %d\n", i, j, f[i][j]);
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
printf("\tf[%d][%d] = %d;\n", i, j, mul(f[i][j], inv(pow2[i * j], Mod)));
}
}
} int main() {
freopen("young.txt", "w", stdout);
init();
solve();
return ;
}
bzoj 4770 图样 - 概率与期望 - 动态规划的更多相关文章
- NOIP 2016 换教室 (luogu 1850 & uoj 262) - 概率与期望 - 动态规划
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- poj 2096 Collecting Bugs - 概率与期望 - 动态规划
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂
(Another) YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into th ...
- BZOJ 3270: 博物馆 概率与期望+高斯消元
和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...
- BZOJ 3566 [SHOI2014]概率充电器 ——期望DP
期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...
- 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...
- 【BZOJ3566】概率充电器(动态规划)
[BZOJ3566]概率充电器(动态规划) 题面 BZOJ Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: "采用全新纳米级加工 ...
- BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...
- 概率及期望DP小结
资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...
随机推荐
- 报文分析5、UDP协议的头结构
UDP协议的头结构 源端口(2字节) 目的端口(2字节) 封报长度(2字节) 校验和(2字节) 数据 (1)源端口(Source Port):16位的源端口域包含初始化通信的端口号.源端口和IP地址的 ...
- Python 学习笔记6 变量-元组
我们在上一篇中了解了变量list(列表), 今天我们来介绍下元组.元组是由括号和逗号,组织起来的一个元素的集合.和list不同的是,它其中的元素是不能被修改的,和其他语言中的常量相类似. 需要注意的是 ...
- arcengine导出复本
参考: https://gis.stackexchange.com/questions/172315/creating-checkout-replica-in-arcobjects-from-arcs ...
- python之dict
一.字典的定义 在python中,字典数据类型使用{}来定义,在大括号中,存储的是键值对,即key:value的形式,并且key不能有重复值,如果有重复,后面的值会覆盖前面的:值可以重复 # 字典的定 ...
- 【Python全栈-JavaScript】jQuery事件
jQuery事件 一.页面载入 当DOM载入就绪可以查询及操纵时绑定一个要执行的函数. 这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度. 简单地说,这个方法纯粹是对向 w ...
- go 学习第一个hello world 遇到的问题
mac:Go安装和配置+GoLand安装和使用之完整教程 https://blog.csdn.net/zxy_666/article/details/80182688 前言作为一个go语言程序员,觉得 ...
- koa1 源码详解1
koa的核心设计 是由 koa 与 koa-compose两个包构成的. 包含了 上下文context的创建引用,中间件的概念及其合并执行的机制. application.js koa1.0中直接将c ...
- 013-mac重做系统后的软件安装
一.系统设置 1.屏幕设置:系统偏好设置→显示器→排列,多个显示器可以排列组合 2.touch bar功能键设置:系统偏好设置→键盘→键盘,触控栏设置 F1 3.程序坞[dock]设置:系统偏好设置→ ...
- flask shell命令
在flask项目目录下,使用pipenv shell激活flask虚拟环境后,调用flask shell能够使用虚拟环境的python解释器进入交互式环境,并且工作目录还保留在flask项目目录. f ...
- windows环境在本地配nginx
本地搭建了前端项目,但奈何有时候需要https访问的需求,所以做了一个尝试在本地(windows环境)下配置nginx,最终的效果就是 搭建的时候,遇到两个问题: 第一个是如果要在本地搭建https, ...