题意

n个点的完全图,每个点的点权是在m位的二进制数中随机选取的.每条边的边权是两个点的点权的异或值.

问最小生成树的边权和的期望.模一个质数输出.

分析

考试的时候写这个题,然后期望得分100->实际得分20,然后调着调着没调出来呢,然后机房跳闸机器还原当时的打表程序没了.

然后悲痛地按考试时的方法重写一遍,重新打表,能A啊... 我的80分呢?

怎样少挂题?提高1A率.怎样提高1A率?少挂题.

*

首先只有\(2^nm\)种情况,我们可以算出所有的最小生成树的权值之和再除以总的方案数.

对于某种点权确定的图,我们要最小化边权之和,首先可以考虑最小化最高位是1的边数.

如果所有点的最高位都是1或0,那么不会有最高位是1的边.

否则,我们总能做到只有一条边最高位是1.

可以先在最高位是1的所有点之间连边形成一个连通块,再在最高位是0的所有点之间连边形成一个连通块.然后在两个连通块之间连一条边.

按照这个思路可以定义solve(n,m)求出n个点,权值m位的所有的图的MST权值之和.

最高位全都相同的情况,直接递归到solve(n,m-1)

最高位不同的情况,分成两个连通块,枚举连通块大小i和(n-i),分别递归到solve(i,m-1)和solve(n-i,m-1)

此时还要考虑两个连通块之间连的边的边权的较低m-1位.

这个边权相当于一个连通块有i个随机的m-1位二进制数,另一个连通块有n-i个随机的m-1位二进制数,各选出一个使得异或值最小.

于是还要再定义一个DP求出所有方案中这个最小的异或值之和.

然后我写得复杂度比较高,只能打表...把比较暴力过不了的代码放上来.

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=258280327;
int C[55][55];
int qpow(int a,int x){
int ans=1;
for(;x;x>>=1,a=a*1ll*a%mod){
if(x&1)ans=ans*1ll*a%mod;
}
return ans;
}
struct calc{
int a[256],sz;
int& operator [](int x){return a[x];}
calc(){}
calc(int x){
sz=x;for(int i=0;i<sz;++i)a[i]=0;
}
int res(){
int ans=0;
for(int i=0;i<sz;++i){
ans=(ans+a[i]*1ll*i%mod)%mod;
}
return ans;
}
}F[55][55][8];
bool vis[55][55][8];
calc solve2(int n1,int n2,int m){
if(vis[n1][n2][m])return F[n1][n2][m];
calc& tmp=F[n1][n2][m];tmp=calc(1<<m); if(m==1){
tmp[1]=2;tmp[0]=(qpow(2,(n1+n2))+mod-2)%mod;
return tmp;
}
vis[n1][n2][m]=true;
calc tmp1(1<<m),tmp2(1<<m);
tmp1=solve2(n1,n2,m-1);
for(int i=0;i<tmp1.sz;++i){
tmp[i]=(tmp[i]+tmp1[i]*2%mod)%mod;
tmp[tmp1.sz+i]=(tmp[tmp1.sz+i]+tmp1[i]*2%mod)%mod;
}
for(int i=1;i<n1;++i){
tmp1=solve2(i,n2,m-1);
for(int j=0;j<tmp1.sz;++j){
tmp[j]=(tmp[j]+tmp1[j]*1ll*C[n1][i]%mod*2%mod*qpow(2,(n1-i)*(m-1))%mod)%mod;
}
}
for(int i=1;i<n2;++i){
tmp1=solve2(n1,i,m-1);
for(int j=0;j<tmp1.sz;++j){
tmp[j]=(tmp[j]+tmp1[j]*1ll*C[n2][i]%mod*2%mod*qpow(2,(n2-i)*(m-1))%mod)%mod;
}
}
for(int i=1;i<n1;++i){
for(int j=1;j<n2;++j){
tmp1=solve2(i,j,m-1);tmp2=solve2(n1-i,n2-j,m-1);
for(int k1=0;k1<tmp1.sz;++k1){
for(int k2=0;k2<tmp1.sz;++k2){
tmp[min(k1,k2)]=(tmp[min(k1,k2)]+tmp1[k1]*1ll*tmp2[k2]%mod*C[n1][i]%mod*C[n2][j])%mod;
}
}
}
}
// printf("%d %d %d\n",n1,n2,m);
// for(int i=0;i<(1<<m);++i)printf("%d ",tmp[i]);printf("\n");
return tmp;
}
int SOLVE2(int n1,int n2,int m){
if(vis[n1][n2][m])return F[n1][n2][m].res();
else solve2(n1,n2,m);
return F[n1][n2][m].res();
}
bool used[55][55];int f[55][55];
int solve(int n,int m){
if(used[n][m])return f[n][m];
if(n==1){
used[n][m]=true;return f[n][m]=0;
}
if(m==1){
used[n][m]=true;
return f[n][m]=(qpow(2,n)-2+mod)%mod;
}
used[n][m]=true;
int &ans=f[n][m];
ans=2ll*solve(n,m-1);
for(int i=1;i<n;++i){
ans=(ans+C[n][i]*1ll*(qpow(2,(n-i)*(m-1))*1ll*solve(i,m-1)%mod+qpow(2,i*(m-1))*1ll*solve(n-i,m-1)%mod+qpow(2,n*(m-1))*1ll*(1<<m-1)%mod+SOLVE2(i,n-i,m-1))%mod)%mod;
}
return ans;
}
int main(){
C[0][0]=1;
for(int i=1;i<55;++i){
C[i][0]=1;
for(int j=1;j<=i;++j){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
int n,m;
scanf("%d%d",&n,&m);
printf("%lld\n",qpow(qpow(2,n*m),mod-2)*1ll*solve(n,m)%mod);
return 0;
}

bzoj4770 图样的更多相关文章

  1. BZOJ4770 图样(概率期望+动态规划)

    考虑求出所有MST的权值和再除以方案数,方案数显然是2mn. 按位考虑,显然应该让MST里的边高位尽量为0.那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条 ...

  2. 安卓开发常用icon/png图样

    平时开发当中会用到很多png图样,但是自己又不太会做,因此做好的办法就是直接在网上下载下来用了,这里给大家推荐一个比较好用的网站,免费的,有很多好的png可以直接下载下来使用. http://www. ...

  3. P3900 [湖南集训]图样图森破

    P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个 ...

  4. Bzoj 3654 图样图森波 题解

    3654: 图样图森破 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 123  Solved: 66[Submit][Status][Discuss] ...

  5. BZOJ3654 : 图样图森破

    考虑枚举回文中心,然后向两边扩展,当匹配到当前串的边界的时候,枚举下一个串接上. 这个过程可以通过记忆化搜索来完成,设: $f[i][0]$表示对于$i$这个位置,$[i,串结尾]$等待匹配的最长回文 ...

  6. bzoj 4770 图样 - 概率与期望 - 动态规划

    题目传送门 传送门I 传送门II 题目大意 有一个$n$个点的完全图,每个点的权值是$[0, 2^{m})$中的随机整数,两点间的边的权值是两点点权的异或和,问它的最小异或生成树的边权和的期望. 考虑 ...

  7. E-R图样例

    基本知识 基本的ER模型包含三类元素:实体.关系.属性. 实体(Entities):实体是首要的数据对象,常用于表示一个人.地方.某样事物或某个事件.一个特定的实体被称为实体实例(entity ins ...

  8. 【Python】【demo实验24】【练习实例】【打印图样】

    原题: 打印出如下图案(菱形): * *** ***** ******* ***** *** * 我的源码: #!/usr/bin/python # encoding=utf-8 # -*- codi ...

  9. 20200104模拟赛 问题A 图样

    题目 分析: 老规矩,遇到期望要准备好随时投降... 大致想到了按位处理,然后分别下去搜索,再用组合数加加减减一下... 但是两个连通块之间连边的期望怎么算呢? 很好,投降... 下来看题解... 果 ...

随机推荐

  1. 微信小程序判断按钮是否显示,或者隐藏

    js中: onLoad:function(options) { this.setData({ orderstate:'待送检' }) },   WXML中: <view wx:if=" ...

  2. jdk各种老版本的下载链接

    java SE 1.6各个版本 jdk  api http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downlo ...

  3. day7 opencv+python 读取视频,没有东西

    1.读取视频man.avi, 报错. 我的视频和文件在同一目录下. #coding=utf-8 import numpy as np import cv2 cap = cv2.VideoCapture ...

  4. 【LG3242】 [HNOI2015]接水果

    题面 洛谷 题解 20pts 对于\(n,P,Q\leq 3000\),暴力判断每条路径的包含关系然后排序\(kth\)即可,复杂度\(O(PQ\log P)\) 另30pts 原树为一条链. 发现对 ...

  5. javaweb总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  6. javaweb(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  7. Linux 防火墙设置(转)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  8. robotframework 脚本编写规范

    测试集.脚本 测试脚本的名字不要超过20个字符,文件类型应该为txt  名字必需易读且有意义(看名知意)  记住测试集的名字是自动根据文件.目录的名字创建的.后缀名会被截去,下划线会转换为空格,如果名 ...

  9. JUC——线程同步锁(锁处理机制简介)

    锁处理机制简介 juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题. 为了解决这样的缺陷,juc里面重新针对于锁的概念进行 ...

  10. 003--MySQL 数据库事务

    什么是事务? 事务是一组原子性的 SQL 查询, 或者说是一个独立的工作单元. 在事务内的语句, 要么全部执行成功, 要么全部执行失败. 事务的 ACID 性质 数据库事务拥有以下四个特性, 即 AC ...