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 service本类中方法调用另一个方法事务不生效问题(转载)
前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门写此篇帖子分析why. 1.预备知识 aop概 ...
- Oracle 史上最全近百条Oracle DBA日常维护SQL脚本指令
史上最全近百条Oracle DBA日常维护SQL脚本指令 https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650281305&am ...
- shell 脚本中执行sql
#!/bin/bashsql='show databases' result=`mysql -uroot -pengine2user -h127.0.0.1 -e "${sql}" ...
- Django create和save方法
Django的模型(Model)的本质是类,并不是一个具体的对象(Object).当你设计好模型后,你就可以对Model进行实例化从而创建一个一个具体的对象.Django对于创建对象提供了2种不同的s ...
- 6-4 The present perfect
1 Summary The present perfect is an important verb tense in English. It is used to talk about things ...
- C# Note37: Writing unit tests with use of mocking
前言 What's mocking and its benefits Mocking is an integral part of unit testing. Although you can run ...
- SELECT list is not in GROUP BY clause and contains nonaggregated column
报错如下: Expression # of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.m ...
- 一个".java"源文件中是否可以包括多个类
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 现在我们编个测试文件来测试一番(一个程序员要具有用于探索的精神 -.- 手动滑稽) 1.编写一个 a ...
- bugku web web基础
web基础$_GET $what=$_GET['what'];echo $what;if($what=='flag')echo 'flag{****}'; 看了这段代码知道,需要用get提交what= ...
- 单双通道对RTX有何影响?结果出乎意料
此前,我们在统计RTX游戏本数据时发现了一个有趣的现象,游戏本上的RTX显卡性能出现了明显断层,具体来说就是RTX 2080的性能要远好于RTX 2080 Max-Q,两者差距幅度高达37%,详细测试 ...