BZOJ4770 图样(概率期望+动态规划)
考虑求出所有MST的权值和再除以方案数,方案数显然是2mn。
按位考虑,显然应该让MST里的边高位尽量为0。那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条最小边得到的。两部分的MST权值和可以dp得到,即设f[i][j]表示i个点权值在0~2j-1的MST权值和,枚举最高位是0的点的数量k,由f[k][j-1]和f[i-k][j-1]转移而来。问题只剩下求最小边的权值和。
这个东西也不是很好求,考虑求最小边不小于某值的方案数。同样根据最高位是0还是1划分点集成四个部分,转移比较显然,主要注意边界,即所有边该位都为1的情况,以及某边没有点的情况。盯着这个边界调了一下午最后发现果然这里根本就没写挂,而是预处理2k时少了一部分。惨绝人寰。
复杂度O(n4m2m),虽然darkbzoj上只跑了3s,bzoj上还是根本卡不过去。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 51
#define M 8
#define P 258280327
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,C[N][N],f[N][M+],g[N][N][M],h[N][N][M][<<M],p[N*M];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int inv(int a)
{
int s=;
for (int k=P-;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4770.in","r",stdin);
freopen("bzoj4770.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
C[][]=;
for (int i=;i<=n;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%P;
}
p[]=;for (int i=;i<(n+)*m;i++) p[i]=(p[i-]<<)%P;
for (int i=;i<=n;i++)
for (int j=;j<=n-i&&j<=i;j++)
h[i][j][][]=;
for (int k=;k<m;k++)
for (int x=;x<(<<k);x++)
{
for (int i=;i<=n;i++) h[i][][k][x]=p[i*k];
for (int i=;i<=n;i++)
for (int j=;j<=n-i&&j<=i;j++)
for (int u=;u<=i;u++)
for (int v=;v<=j;v++)
if (u==&&j==v||i==u&&v==) inc(h[i][j][k][x],1ll*h[max(u,j-v)][min(u,j-v)][k-][max(x-(<<k-),)]*h[max(i-u,v)][min(i-u,v)][k-][max(x-(<<k-),)]%P);
else inc(h[i][j][k][x],1ll*C[i][u]*C[j][v]%P*h[max(u,v)][min(u,v)][k-][x]%P*h[max(i-u,j-v)][min(i-u,j-v)][k-][x]%P);
}
for (int i=;i<=n;i++)
for (int j=;j<=n-i&&j<=i;j++)
for (int k=;k<m;k++)
for (int x=;x<(<<k);x++)
inc(g[i][j][k],h[i][j][k][x]);
for (int k=;k<=m;k++)
for (int i=;i<=n;i++)
{
inc(f[i][k],f[i][k-]);inc(f[i][k],f[i][k-]);
for (int j=;j<i;j++)
inc(f[i][k],1ll*C[i][j]*(1ll*f[j][k-]*p[(i-j)*(k-)]%P+1ll*f[i-j][k-]*p[j*(k-)]%P+p[(k-)*(i+)]+g[max(j,i-j)][min(j,i-j)][k-])%P);
}
cout<<1ll*f[n][m]*inv(p[m*n])%P;
return ;
}
BZOJ4770 图样(概率期望+动态规划)的更多相关文章
- 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)
容易发现跟树没什么关系,可以预处理出每个点若走向分叉点期望走多少步才能回到上个存档点,就变为链上问题了.考虑dp,显然有f[i][j]表示在i~n中设置了j个存档点,其中i设置存档点的最优期望步数.转 ...
- BZOJ4832 抵制克苏恩(概率期望+动态规划)
注意到A+B+C很小,容易想到设f[i][A][B][C]为第i次攻击后有A个血量为1.B个血量为2.C个血量为3的期望伤害,倒推暴力转移即可. #include<iostream> #i ...
- UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化,设离散化后的值域为 $[0,m]$ . 首先把问题转化一下,变成:对于每一个位置 $i$ ...
- BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- uvalive 7331 Hovering Hornet 半平面交+概率期望
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
随机推荐
- winform 的语言国际化
http://www.cnblogs.com/codefish/p/4778269.html
- 成都Uber优步司机奖励政策(3月2日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 宁波Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Java语言简介
Java即计算机编程语言 1.概念 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Jav ...
- xencenter迁移云主机方法
问题:POOL中计算节点内存不足. 解决方法:1.为计算节点添加内存(费用高)2.将部分资源迁移到其它POOL中. 方法: 1.选择要迁移的虚拟机 2.选择保存路径 这里可以看到可以批量导出: 注意: ...
- C 关键字 标示符 注释
一 关键字 1. 什么是关键字 关键字就是C语言提供的有特殊含义的符号 也叫做"保留字" C语言一共提供了32个关键字 这些关键字都被C语言赋予了特殊含义 auto double ...
- Unity Lighting - Choosing a Rendering Path 选择渲染路径(三)
Choosing a Rendering Path 选择渲染路径 Unity supports a number of rendering techniques, or ‘paths’. An i ...
- JAVA基础学习之路(三)类定义及构造方法
类的定义及使用 一,类的定义 class Book {//定义一个类 int price;//定义一个属性 int num; public static int getMonney(int price ...
- Java学习 · 初识 面向对象基础二
Package 为什么需要使用package a) 解决类重名的问题 b) 便于管理类 怎么使用package a) 类的第一句非注释性语句 b) 命名:域名倒着写,再加上模块名 注意 ...
- vmware centOS上网配置笔记
⦁ 修改/etc/sysconfig/network-scripts/ifcfg-eth0文件 (首先查看本机vmware 虚拟网络编辑器中的网关) 重启网络 使用命令:service net ...