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\)):一次随机试验产生的一个结果. 样本空 ...
随机推荐
- Python 学习笔记6 变量-字典
字典是python中一个十分重要的变量,他是一个可变的容器对象.通过一组key(键)和value(值)对组成一个元素. 组成形式为{'key':'value', 'key':'value'}.整个字典 ...
- java script基本数据类型与数组
基本数据类型 1.undefined (var a;) 2.null (var a=null); 3.String (var a=" " or ' '); 4.boolea ...
- 第五周ip通信基础回顾
广播请求,单播响应,ARP IPV4,IP地址32位二进制代码分为8个位一组 路由器每一个接口都是一个网段 ,网段与网段区分看网络地址 同一段链路是同网段 直接广播:主机号全为1 受限广播:全为1 特 ...
- nodejs实时的检测系统文件的变化(无需重启服务)
1.安装superior npm -g install supervisor 注意 superior必须全局安装,否则错误命令会提示安装到全局 2.修改启动 现在我们需要使用 supervisor a ...
- 发现了一个比较有意思的url参数
今天登录阿里云发现需要二次验证了,手机号不是我的很麻烦,然后就看到有个手机app快捷登录的方式,点进去一看,链接地址是这样的http://qd.alibaba.com/onekey.htm?spm=0 ...
- 9、Flutter 实现 生成二维码
1.加入依赖 在 pubspec.yaml 中 dependencies 节点下添加: dependencies: qr_flutter: ^ 2.引入代码 在需要细线二维码的 dart 类中引入依赖 ...
- idea+maven下jrebel的安装破解
链接地址:https://www.cnblogs.com/wang1024/p/7211194.html
- 2018-2019 20175232 实验二《Java面向对象程序设计》实验报告
一.实验内容及步骤 1熟练掌握Junit和TDD: TDD(Test Driven Devlopment, 测试驱动开发)我们是该“先写产品代码,然后再写测试代码,通过测试发现了一些Bugs,修改代码 ...
- 蓝桥杯近3年决赛题之3(17年b组)
做的时候对了2个小题,一个大题可能会拿点分数. 1. 标题:36进制 对于16进制,我们使用字母A-F来表示10及以上的数字.如法炮制,一直用到字母Z,就可以表示36进制. 36进制中,A表示10,Z ...
- c# ASP.NET Core2.2利用中间件支持跨域请求
1.public void Configure(IApplicationBuilder app, IHostingEnvironment env)方法里面 不要加上:app.UseCors(); 2. ...