UOJ#422. 【集训队作业2018】小Z的礼物
min-max容斥
转化为每个集合最早被染色的期望时间
如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x
但是x会变,中途统计答案会很麻烦
所以把x记录到状态里!
轮廓线DP
f[i][j][s][x]到了(i,j),轮廓线选择情况是s,x个选择可以染色的所有方案的(-1)^(|T|+1)的和
枚举(i,j)选不选,x的增长直接用s和(i,j)位置计算即可。
相当于每个T在x的位置上被考虑了恰好一次。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
using namespace Modulo;
namespace Miracle{
const int N=;
const int M=;
int f[M][N][<<][];
char mp[M][N],tc[N][M];
int n,m;
int val(int i,int j,int c,int s){
int ret=;
if(c==){
if(i!=&&((s>>(j-))&)) ++ret;
if(j!=&&((s>>(j-))&)) ++ret;
return ret;
}else{
if(i!=) ++ret;
if(j!=) ++ret;
return ret;
}
}
int main(){
rd(n);rd(m);
for(reg i=;i<=n;++i){
scanf("%s",tc[i]+);
}
swap(n,m);
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
mp[i][j]=tc[m-j+][i];
// cout<<mp[i][j];
}
// cout<<endl;
}
f[][m][][]=mod-;
int sum=;
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
// cout<<" now "<<"("<<i<<","<<j<<")"<<endl;
for(reg s=;s<(<<m);++s){
for(reg x=;x<=sum;++x){
//no choose
int li,lj;
if(j==) li=i-,lj=m;
else li=i,lj=j-; if(!f[li][lj][s][x]) continue;
int v=f[li][lj][s][x]; int ns=s;
if((s>>(j-))&) ns^=(<<(j-));
inc(f[i][j][ns][x+val(i,j,,s)],v); if(mp[i][j]=='*'){
//choose
ns|=(<<(j-));
inc(f[i][j][ns][x+val(i,j,,s)],mod-v);
}
}
}
int ct=;
if(i!=) ++ct;
if(j!=) ++ct;
sum+=ct; // cout<<" sum "<<sum<<endl;
// for(reg s=0;s<(1<<m);++s){
// for(reg x=0;x<=sum+10;++x){
// cout<<" s "<<s<<" x "<<x<<" : "<<f[i][j][s][x]<<endl;
// }
// }
}
}
ll ans=;
// cout<<sum<<endl;
for(reg s=;s<(<<m);++s){
for(reg x=;x<=sum;++x){
ans=ad(ans,mul(f[n][m][s][x],mul(sum,qm(x))));
}
}
ot(ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
把x记录到状态里还要注意一下
UOJ#422. 【集训队作业2018】小Z的礼物的更多相关文章
- UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp
LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- UOJ#428. 【集训队作业2018】普通的计数题
#428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...
随机推荐
- 关于Synthesis
1,当追求面积最小时 会以牺牲Fmax为代价,可以使用一下setting: fit_pack_for_density=on fit_report_lab_usage_stats=on 可在 .qsf ...
- 有关阿里云对SaaS行业的思考,看这一篇就够了
过去二十年,随着改革开放的深化,以及中国的人口红利等因素,中国诞生了大批To C的高市值互联网巨头,2C的领域高速发展,而2B领域一直不温不火.近两年来,在C端流量饱和,B端数字化转型来临的背景下,中 ...
- Django之深入了解路由层
目录 ORM表关系建立 一对一 一对多 多对多 Django 请求生命周期 url 路由层 路由匹配 无名分组 有名分组 反向解析 路由匹配条件无分组的情况的反向解析 无名分组情况的反向解析 有名分组 ...
- idea加载完文件报错:java:-source 1.7中不支持lambda表达式 解决方案
1.file - Project Structure ctrl+alt+shift+s 2.modules 中把7换成8
- js 手机号加密 中间星号表示
var tel = String(this.memberMsg.phoneNo); var dh=tel.substr(0,3)+"******"+tel.substr(8); r ...
- 安装elasticsearch-head插件
安装node ###下载 wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz ### 解压 tar xvf nod ...
- Cesium官方教程10--高级粒子特效
原文地址:https://cesiumjs.org/tutorials/Particle-Systems-More-Effects-Tutorial/ 高级粒子系统特效 这篇教程学习更多的效果,包括天 ...
- 跟我一起安装vmware
第一步查看我们的电脑配置 我是windows10,下面的方法是windows10来安装vmware 第二步双击下图文件 (1) 2)弹出如下图,点击下一步即可. (3)一直点击下一步(期间会同意,勾选 ...
- java虚拟机(十)--性能监控工具测试内存溢出和死锁基本思路
在之前就曾经简单介绍过jdk自带的性能检测工具,但是只是很入门的内容.没有真正的用过都是白扯了,面试的时候也说不过去,更别提真正 在生产环境去解决问题,所以这里我们学习一下真正解决问题的过程,最起码面 ...
- Django中间件分析
SessionMiddleware 浏览器会发送包含SESSION_COOKIE_NAME的的Cookie 中间件从django_session中按照SESSION_COOKIE_NAME取出存入的s ...