Luogu P4321 随机漫游
期望DP要倒着推
题意
不一定是树,询问点不一定均为1
$Solution$
设计一个巧妙的DP状态
设$ F(S,x)$表示当前在点$ x$已经走遍了$ S$,走完剩下所有点的期望步数
这样推转移$ DP$的时候一定是从$ F(S|y,y)$转移过来
容易发现$ S|y$->$S$是不可能会变大的,即这维不可能成环
因此从大到小枚举$ S$,对当前$ S$,显然比$ S$大的状态已经被计算,暴力$ n^3$高斯消元消出这维就好了
时间复杂度$ O(2·n·n^3)$
但
为什么不直接$ Min-Max$容斥呢
每次枚举$ S$消出当前$ Min(S,x)$中的x这维
复杂度不变
而且很好写啊...
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 998244353
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,S;
bool link[][];int a[][],d[];
int inv[],ans[][<<];
int ksm(int x,int y=p-){
int ans=;
for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
return ans;
}
void gauss(){
for(rt i=;i<=n;i++)if(!(S>>i-&)){
for(rt j=i;j<=n;j++)if(a[j][i]){
if(j!=i)for(rt k=;k<=n+;k++)swap(a[i][k],a[j][k]);
break;
}
if(!a[i][i])continue;
inv[i]=ksm(a[i][i]);
for(rt j=i+;j<=n;j++)if(a[j][i]){
const int x=1ll*a[j][i]*inv[i]%p;
for(rt k=i;k<=n+;k++)if(a[i][k])(a[j][k]-=1ll*a[i][k]*x%p)%=p;
}
}
for(rt i=n;i>=;i--)if(!(S>>i-&)){
ans[i][S]=1ll*a[i][n+]*inv[i]%p;
for(rt j=i-;j>=;j--)if(a[j][i])(a[j][n+]-=1ll*ans[i][S]*a[j][i]%p)%=p;
}
}
int ret[][<<];
int main(){
n=read();m=read();
for(rt i=;i<=m;i++){
x=read();y=read();d[x]++;d[y]++;
link[x][y]=link[y][x]=;
}
//Max(S)走遍集合S的时间
//Min(S)第一次走到S的时间
for(S=;S<(<<n);S++){
memset(a,,sizeof(a));
for(rt i=;i<=n;i++){
if(S>>i-&)a[i][i]=;
else {
for(rt j=;j<=n;j++)if(link[i][j]&&!(S>>j-&))a[i][j]=-;
a[i][i]=d[i];a[i][n+]+=d[i];
}
}
gauss();
}
//Max(S)=sigma Min(T) (-1)|T|+1
for(rt i=;i<=n;i++){
for(rt j=;j<(<<n);j++)if(!(__builtin_popcount(j)&))ans[i][j]*=-;
for(rt j=;j<n;j++)
for(rt k=;k<(<<n);k++)if(k>>j&)(ans[i][k]+=ans[i][k^(<<j)])%=p;
}
for(rt T=read();T;T--){
n=read();S=;
for(rt i=;i<=n;i++)S|=(<<read()-);
x=read();writeln((ans[x][S]+p)%p);
}
return ;
}
Luogu P4321 随机漫游的更多相关文章
- luogu P4321 随机漫游 期望dp 二进制 高斯消元
LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...
- 洛谷 P4321 【随机漫游】
题目大意 给出\(n(n\leq 18)\)个点的无向连通图,\(m(m\leq 10^5)\)次询问.每次询问给出一个点集和一个起点\(s\),询问从\(s\)出发,经过这个点集中的每一个点至少一次 ...
- BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)
emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...
- 快速构建Windows 8风格应用27-漫游应用数据
原文:快速构建Windows 8风格应用27-漫游应用数据 本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 一.漫游应用数据概览 1.若应用当中使用了漫游应用数据, ...
- UWP开发:应用文件存储
应用设置由于数据量和数据类型的限制,有很大的局限性,所以还需要应用文件存储,以文件的方式存储数据.在每个应用的应用数据存储中,该应用拥有系统定义的根目录:一个用于本地文件,一个用于漫游文件,还有一个用 ...
- Python编程:从入门到实践 - matplotlib篇 - Random Flow
随机漫游 # random_flow.py 随机漫游 import random class RandomFlow(): """一个生成随机漫游数据的类"&qu ...
- UE4蓝图AI角色制作(三)
接上一节 6. 寻路网格体代理 通过允许配置多个"代理",虚幻引擎使得用户能够轻松为大小各异的AI创建寻路网格体.首先,选中世界大纲视图中的"RecastNavMesh& ...
- UE4蓝图AI角色制作(六)之行为树
13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...
- UE4蓝图AI角色制作(七)之追逐玩家
15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...
随机推荐
- Spring Boot 学习之路二 配置文件 application.yml
一.创建配置文件 如图所示,我们在resources文件夹中新建配置文件application.yml 结构图 二.一些基本配置 server: port: 8090 //配置端口 session ...
- jquery.amaran jquery提示类使用
<script src="ing/js/jquery-1.8.3.min.js"></script> <link rel="styleshe ...
- 在app中从下向上滑动,以找到不在默认第一页的元素
1.在app中,如果第一面没有出现你要的元素,需要下滑拉动到你需要的元素的位置
- JDK1.8源码(十)——java.util.LinkedHashSet类
同 HashSet 与 HashMap 的关系一样,本篇博客所介绍的 LinkedHashSet 和 LinkedHashMap 也是一致的.在 JDK 集合框架中,类似 Set 集合通常都是由对应的 ...
- app.use和app.get,app.post区别
express中,express的实例app: app.use(path,callback)中的callback既可以是router对象又可以是函数 app.get(path,callback)中的c ...
- python 支付宝SDK
python 支付宝SDK代码如下 from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signatu ...
- JAVA ==号和equals()的区别
==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值: int x = 10; ...
- 其它综合-使用Putty远程连接管理Linux实践
使用Putty远程连接管理Linux实践 1.获取putty 获取 putty有很多方法,以下是我为大家提供的下载地址: 个人网盘地址,提取码:tz83 官方下载地址 解释: 官方下载的是 zip 压 ...
- 7.docker日志收集
默认情况下,docker logs或者docker service logs显示命令的输出,就像在终端中以交互方式运行命令时一样.UNIX和Linux命令通常开在运行时间上三个I / O流,所谓的 S ...
- nginx 80 端口 部署多个Web
1.修改默认nginx.conf 文件 加入 include /usr/www/ngconfs/*.conf; 读取ngconfs文件下所有 *.conf文件 2.ngconfs 下多个文件创建 第二 ...