bzoj5153 [Wc2018]州区划分
正解:子集和变换。
考场上只会暴力和$p=0$的情况,还只会$O(2^{n}*n^{3})$的。
然而这题题面出锅,导致考场上一直在卡裸暴力,后面的部分分没写了。。听$laofu$说$O(2^{n}*n^{3})$可以过。。
所以直接讲正解。。
我们假设每个城市可以在两个不同集合,那么可以把子集卷积变成或卷积。
我们只要记下当前总共有多少个点,于是考虑设$f[i][S]$表示$i$个点,集合为$S$的方案数。
最后的$f[n][all]$就是答案,显然这个状态中的每个城市只会出现一次。
那么$f[i][S]=\sum f[j][T]*(\frac{sum[A]}{sum[S]})^{p}$,其中$A|T=S$,且$A$是一个合法集合。
可以把分母移项到左边,然后我们可以设$g[i][S]$表示如果$S$是一个合法集合,且$S$的位数为$i$,那么$g[i][S]=sum[S]^{p}$,否则为$0$。
那么$f[i][S]*sum[S]^{p}=\sum f[j][T]*g[i-j][A]$。注意到这个式子可以直接$FMT$以后点乘,再$IFMT$回来以后作除法得到,总复杂度为$O(2^{n}*n^{2})$。
感觉这道题其实并没有那么难,但是考场上被题面以及固定的套路给局限住了,所以并没有想到可以交换$dp$的两维状态从而优化复杂度。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (998244353)
#define N (1<<21|1) using namespace std; int fa[],g[],w[N],cnt[N],can[N],inv[],n,m,p,all;
int f[][N],h[][N]; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return q*x;
} il int qpow(RG int a,RG int b){
if (!b) return ;
if (b==) return a;
return 1LL*a*a%rhl;
} il void fmt(int *a){
for (RG int i=;i<all;i<<=)
for (RG int j=;j<all;++j){
if (j&i) a[j]+=a[j^i];
if (a[j]>=rhl) a[j]-=rhl;
}
return;
} il void ifmt(int *a){
for (RG int i=;i<all;i<<=)
for (RG int j=;j<all;++j){
if (j&i) a[j]-=a[j^i];
if (a[j]<) a[j]+=rhl;
}
return;
} il int find(RG int x){
return fa[x]==x ? x : fa[x]=find(fa[x]);
} int main(){
#ifndef ONLINE_JUDGE
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
#endif
n=gi(),m=gi(),p=gi(),all=<<n,inv[]=;
for (RG int i=,u,v;i<=m;++i)
u=gi()-,v=gi()-,g[u]|=<<v,g[v]|=<<u;
for (RG int i=;i<=;++i)
inv[i]=1LL*(rhl-rhl/i)*inv[rhl%i]%rhl;
for (RG int i=;i<n;++i) w[<<i]=gi(); fmt(w);
for (RG int i=;i<all;++i) cnt[i]=cnt[i>>]+(i&);
for (RG int i=,fg,lst;i<all;++i){
fg=,lst=-;
for (RG int j=;j<n;++j) fa[j]=j;
for (RG int j=;j<n;++j){
if (!(i>>j&)) continue;
for (RG int k=,x,y;k<n;++k){
if (!(i>>k&) || !(g[j]>>k&)) continue;
x=find(j),y=find(k); if (x!=y) fa[x]=y;
}
}
for (RG int j=;j<n;++j){
if (i>>j&){
if (lst==-) lst=find(j);
else if (lst!=find(j)){ fg=; break; }
}
if ((i>>j&) && (cnt[g[j]&i]&)){ fg=; break; }
}
can[i]=fg;
}
for (RG int i=;i<all;++i) if (can[i]) h[cnt[i]][i]=qpow(w[i],p);
for (RG int i=;i<=n;++i) fmt(h[i]); f[][]=,fmt(f[]);
for (RG int i=;i<=n;++i){
int *F=f[i];
for (RG int j=;j<i;++j){
int *a=f[j],*b=h[i-j];
for (RG int s=;s<all;++s)
F[s]=(1LL*a[s]*b[s]+F[s])%rhl;
}
ifmt(F);
for (RG int s=;s<all;++s)
F[s]=i==cnt[s]?1LL*F[s]*qpow(inv[w[s]],p)%rhl:;
if (i^n) fmt(F);
}
cout<<f[n][all-]; return ;
}
bzoj5153 [Wc2018]州区划分的更多相关文章
- [WC2018]州区划分——FWT+DP+FST
题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...
- [WC2018]州区划分
[WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...
- [UOJ#348][WC2018]州区划分
[UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...
- [WC2018]州区划分(FWT,FST)
[WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
- P4221 [WC2018]州区划分 无向图欧拉回路 FST FWT
LINK:州区划分 把题目中四个条件进行规约 容易想到不合法当前仅当当前状态是一个无向图欧拉回路. 充要条件有两个 联通 每个点度数为偶数. 预处理出所有状态. 然后设\(f_i\)表示组成情况为i的 ...
- [WC2018]州区划分(FWT)
题目描述 题解 这道题的思路感觉很妙. 题目中有一个很奇怪的不合法条件,貌似和后面做题没有什么关系,所以我们先得搞掉它. 也就是判断一个点集是否合法,也就是判断这个点集是否存在欧拉回路. 如果存在欧拉 ...
- Luogu4221 WC2018州区划分(状压dp+FWT)
合法条件为所有划分出的子图均不存在欧拉回路或不连通,也即至少存在一个度数为奇数的点或不连通.显然可以对每个点集预处理是否合法,然后就不用管这个奇怪的条件了. 考虑状压dp.设f[S]为S集合所有划分方 ...
- LOJ2340 [WC2018] 州区划分 【FMT】【欧拉回路】
题目分析: 这题是WC的题??? 令 $g[S] = (\sum_{x \in S}w_x)^p$ $h[S] = g[S]$如果$S$不是欧拉回路 $d[S] = \frac{f[S]}{g[All ...
- [WC2018]州区划分(状压DP+FWT/FMT)
很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合 ...
随机推荐
- 数据适配:DataAdapter对象概述
DataAdapter对象可用于执行数据库的命令操作,含有四个不同的操作命令,分别如下: SelectCommand:用来选取数据源中的记录: InsertCommand:用来向数据源中新插入一条 ...
- vim 编辑器常规操作
所看视频教程:兄弟连Linux云计算视频教程5.1文本编辑器Vim-5.2 插入命令 a:在光标所在字符后插入; A:在光标所在行尾插入; i:在光标所在字符前插入; I:在光标所在字符行行首插入; ...
- groovy普通方法、抽象方法、接口、trait
/** * Created by Jxy on 2018/12/21 14:07 * trait关键字 * 声明trait中的方法和任何常规方法一样 * trait声明抽象方法需要在实现类中实现 * ...
- 小工具-IP地址获取和设置及端口访问验证(windows)
技术部在业务部门眼里就是后勤部门,业务部门要搬到新大楼去 领导要求去帮忙调试业务人员的电脑,要保证这些大爷们周一上班来,就喝着茶打开新浪,然后打开OA看看. 手上就几个桌面支持的兄弟,要弄一百台多电脑 ...
- edge浏览器无法解析<img>的原因
使用<img>标签插入图片,使用谷歌,ie,等浏览器测试,都可以正常显示图片,但是edge浏览器就是实现不了.经过排查测试,不是文件格式的问题,而是路径带有中文.相对路径中虽然不带中文,但 ...
- 关于AJAX的一些事
在JQ中运用AJAX的操作是很舒服的一件事,一直以来我对他都有个错误的认识,直到遇见了问题才把他研究个透彻. 下面贴出两种AJAX的写法,当然都是正确的. 其一: $.ajax({ type: 'po ...
- Activiti 数据库表自动生成策略
Activiti 引擎启动时默认会检测数据库版本与程序版本是否相符,不相符就会抛出异常停止引擎的初始化. 这一策略可以通过引擎的初始化配置参数databaseSchemaUpdate来控制, 如下图的 ...
- 【转】怎么用PHP发送HTTP请求(POST请求、GET请求)?
file_get_contents版本: /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * ...
- MUI框架-01-介绍-创建项目-简单页面
MUI框架-01-介绍-准备-创建项目 从0开始快速高效学习 MUI 框架 官方文档:http://dev.dcloud.net.cn/mui/ui/ (1)MUI 介绍 MUI 是什么,解决了什么问 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...