bzoj5153&uoj348 【WC2018】州区划分
五十分就是裸的O(3^n)子集dp。
$$f[S]*{w[S]^{p}}=\sum_{T \in S}{f[T]*{w[S-T]^{p}}}$$
然后我们考虑优化这个dp,我们发现这是子集卷积的形式,于是我们就可以用fwt来优化这个dp。
具体的,f[i][S]表示的是S的f值,当且仅当S中1的个数为i,别的f[i][S1]不正确也没有问题,因为我们转移时枚举的是1的个数,所以只有正确的转移会作出正确的贡献。然后就是一个裸的或or异或的fwt。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 2222222
#define mod 998244353
using namespace std;
int can[N],g[N],inv[N],cnt[N],f[][N],h[][N];
int n,m,p,to[],w[];
int e=,head[],fa[];
struct edge{
int v,next;
}ed[];
void add(int u,int v){
ed[e].v=v;ed[e].next=head[u];head[u]=e++;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int qp(int a,int b){
int c=;
while(b){
if(b&)c=1ll*c*a%mod;
a=1ll*a*a%mod; b>>=;
}
return c;
}
void UPD(int &a,int b){
a=(a+b>=mod)?(a+b-mod):(a+b);
}
void IPD(int &a,int b){
a=(a-b<)?(a-b+mod):(a-b);
}
bool check(int s){
if(cnt[s]==)return ;
int a[],num=;
for(int i=;i<=n;i++)if(s&(<<i-)){
a[++num]=i;
int now=s&to[i];
if(!now)return ;
if(cnt[now]&)return ;
}
for(int i=;i<=num;i++)fa[a[i]]=a[i];
for(int i=;i<=num;i++){
for(int j=head[a[i]];j;j=ed[j].next)if(s&(<<ed[j].v-))
if(find(a[i])!=find(ed[j].v))
fa[find(a[i])]=find(ed[j].v);
}
for(int i=;i<=num;i++)
if(find(a[i])!=find(a[]))return ;
return ;
}
int calc(int s){
if(!p)return ;
int ans=;
for(int i=;i<=n;i++)if(s&(<<i-))
UPD(ans,w[i]);
if(p==)return ans;
return 1ll*ans*ans%mod;
}
void fwt(int *a){
for(int k=;k<=(<<n);k<<=)
for(int i=;i<(<<n);i+=k)
for(int j=;j<k>>;j++)
UPD(a[i+j+(k>>)],a[i+j]);
} void ifwt(int *a){
for(int k=;k<=(<<n);k<<=)
for(int i=;i<(<<n);i+=k)
for(int j=;j<k>>;j++)
IPD(a[i+j+(k>>)],a[i+j]);
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<(<<n);i++)cnt[i]=cnt[i>>]+(i&);
for(int i=,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
to[u]|=(<<v-);
to[v]|=(<<u-);
add(u,v);add(v,u);
}
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int i=;i<(<<n);i++){
can[i]=check(i);
g[i]=calc(i);
inv[i]=qp(g[i],mod-);
}
for(int i=;i<(<<n);i++)
h[cnt[i]][i]=can[i]*g[i];
for(int i=;i<=n;i++)fwt(h[i]);
f[][]=;fwt(f[]);
for(int i=;i<=n;i++){
for(int j=;j<i;j++)
for(int k=;k<(<<n);k++)
UPD(f[i][k],1ll*f[j][k]*h[i-j][k]%mod);
ifwt(f[i]);
for(int j=;j<(<<n);j++)
f[i][j]=1ll*f[i][j]*inv[j]%mod;
if(i^n)fwt(f[i]);
}
printf("%d\n",f[n][(<<n)-]);
return ;
}
bzoj5153&uoj348 【WC2018】州区划分的更多相关文章
- UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积
传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...
- [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的 ...
- bzoj5153 [Wc2018]州区划分
题目链接 正解:子集和变换. 考场上只会暴力和$p=0$的情况,还只会$O(2^{n}*n^{3})$的. 然而这题题面出锅,导致考场上一直在卡裸暴力,后面的部分分没写了..听$laofu$说$O(2 ...
- [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 ...
随机推荐
- 记一次erlang语言bug导致rabbitmq的队列没有消费者的问题
公司开发和测试环境采用的erlang版本是19.0.3,rabbitmq版本为3.6.10.集群条件下稳定使用了近一年时间,没什么问题. 为了保持和线下一致,线上生产环境采用了相同的版本,运行几个月后 ...
- LAMP的搭建
可以在网上找整合包: httpd-2.4.18 + mysql-5.6.29 + php-5.5.30编译安装过程: 编译源代码后安装软件的位置:/usr/local/ 一.编译安装apache ap ...
- Web安全工具大汇聚
http://www.owasp.org/index.PHP/Phoenix/Tools http://sebug.net/paper/other/Web安全工具大汇聚.txt =========== ...
- windows10不能修改hosts解决方案(亲测)
hosts文本解释: 有时候我们要破解一些软件与服务器通讯,所以通常都需要更改Hosts文件来达到目的,XP系统可以直接修改保存,但是Win10系统却提示没有权限去修改,那么我们要怎样办呢,我们修改的 ...
- C#避免踩坑之如何添加paint事件
看截图: 首先,右击->属性 然后出来这个界面. 接下来,注意看这个界面的上面:鼠标悬停这个闪电符号,看到没,事件!! 那个闪电符号,点它! 然后下拉找到这个: 你要事先在代码里面添加Form1 ...
- Hadoop 实现 TF-IDF 计算
学习Hadoop 实现TF-IDF 算法,使用的是CDH5.13.1 VM版本,Hadoop用的是2.6.0的jar包,Maven中增加如下即可 <dependency> <grou ...
- 3d轮播图——类似酷狗的轮播
说到轮播图,其实只要是跟web开发相关的无论是前端后端应该都不陌生,各种各样的轮播图,从以前的单纯的平面山水画遮盖滑动或滚动,到Jquery的animate甚至是h5+css3,各种炫酷的轮播图更是层 ...
- JavaScript的数组知识案例之随机点名器
本次分享JavaScript主要知识点涉及到for循环.if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 执行后效果图: 思路: 1.网页结构搭建: HTML 2.网页布局美化: ...
- msql索引
从网上找了两种解决方案: 最近要给一个表加一个联合唯一索引,但是表中的两个联合健有重复值,导致无法创建: 解决方案一:ignore(会删除重复的记录(重复记录只保留一条,其他的删除),然后建立唯一索引 ...
- Hbuilder之开发Python
.开发之前,安装Python 3.6 在Mac上安装Python 如果你正在使用Mac,系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7.要安装最新的Python 3.6, ...