「WC 2018」州区划分
题目大意:
给一个无向图$G(V,E)$满足$|V|<=21$,对于某一种将$G(V,E)$划分为k个的有序集合方案,若每一个子集$G_i(V_i,E_i)$,$E_i=\{(x,y)|x\in V_i,y\in V_i\}$都不存在欧拉回路,则会对答案贡献为
其中,$x$为集合元素,$w_x$为元素$x$的权值。
题解:
被题意坑成Cu……我还是太菜了……
其实很显然我们会得到一个$DP$,设$F_S$为集合$S$划分后的乘积和。
显然我们有转移方程:
$W_S$表示$[G(S,E_S)不存在欧拉回路](\sum_{x\in S}w_x)^P$
一个裸的子集卷积的式子。
时间复杂度$n^2 2^n$
代码:
#include "bits/stdc++.h" using namespace std; inline int read () {
int s=0,k=1;char ch=getchar();
while (ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
while (ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
return s*k;
} const int mod = 998244353,N=1<<21; inline int powmod (int a,int b) {
int ret=1;
while (b) {
if (b&1) ret=ret*1ll*a%mod;
b>>=1,a=a*1ll*a%mod;
}return ret;
} inline void add (int &x,int y) {
x+=y;
if (x>=mod) x-=mod;
} inline void erase (int &x,int y) {
x-=y;
if (x<0) x+=mod;
} inline void FWT (int *a,int n,int f) {
register int i,j,k;
if (f)
for (i=1;i<n;i<<=1)
for (j=0;j<n;j+=i<<1)
for (k=0;k<i;++k) {
int x=a[j+k],y=a[i+j+k];
erase(y,x);
a[i+j+k] = y;
}
else
for (i=1;i<n;i<<=1)
for (j=0;j<n;j+=i<<1)
for (k=0;k<i;++k) {
int x=a[j+k],y=a[i+j+k];
add(y,x);
a[i+j+k] = y;
}
} int f[22][N],g[22][N],n,m,p,fa[21],w[N],num[N],inv[N],v[N];
int mp[N]; inline int calc (int x) {
if (!p) return 1;
if (p&1) return x;
return x*x;
} int finds (int x) {
return fa[x]==x?x:fa[x]=finds(fa[x]);
} inline int check(int S) {
register int i,j;
static int d[21];
for (i=0;i<n;++i) if (S&(1<<i)) fa[i]=i,d[i]=0;
j=num[S];
for (i=0;i<n;++i)
if (S&(1<<i)) {
for (int x=v[i]&S,t;x;x^=x&-x){
++d[i];
t=mp[x&-x];
++d[t];
if (finds(i)^finds(t))fa[fa[i]]=fa[t],--j;
}
}
if (j>1) return true;
for (i=0;i<n;++i) if (S&(1<<i)) if (d[i]&1)return true;
return false;
} inline void add(int *a,int *b,int *c) {
for (register int i=0;i<(1<<n);++i)
add(a[i],b[i]*1ll*c[i]%mod);
} int main () {
n=read(),m=read(),p=read(); register int i,j,k; for (i=0;i<m;++i) {
int x=read()-1,y=read()-1;
v[x]|=1<<y;
}
int S=1<<n;
for (i=0;i<n;++i)
w[1<<i]=read(),mp[1<<i]=i;
for (i=2;i<S;i<<=1)
for (j=1,k=w[i];j<i;++j) {
int x=w[j];
x=x+k;
w[i|j] = x;
}
for (i=1;i<S;++i) {
num[i] = num[i>>1]+(i&1);
int tmp=w[i];
tmp=calc(tmp);
g[num[i]][i] = check(i) * tmp;
inv[i] = powmod(tmp,mod-2);
}
for (i=0;i<S;++i)
f[0][i]=1; for (i=1;i<=n;++i)
FWT(g[i],S,0),
memcpy(f[i],g[i],sizeof f[i]);
for (i=1;i<=n;++i) {
for (j=1;j<i;++j)
for (k=0;k<S;++k) {
int x=f[i][k],y=g[j][k],z=f[i-j][k];
add(x,1ll*y*z%mod);
f[i][k]=x;
}
FWT(f[i],S,1);
for (j=0;j<S;++j) {
int x=f[i][j],y=inv[j];
x=x*1ll*y%mod;
f[i][j] = x;
}
if (i^n) FWT(f[i],S,0);
}
printf("%d\n",f[n][S-1]);
}
「WC 2018」州区划分的更多相关文章
- 「WC2018」州区划分(FWT)
「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)
题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...
- LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)
题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...
- LOJ #2540. 「PKUWC 2018」随机算法(概率dp)
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...
- LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)
Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- 「TJOI 2018」教科书般的亵渎
「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...
- 「TJOI 2018」游园会 Party
「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...
随机推荐
- Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决
在windows平台使用Qt5.8mingw版写出的程序,在Qt中运行正常,而以release的形式编译并且补充完必要的dll文件后,在其他电脑上运行出现了以下问题: 经过查阅许多资料和亲身实验,终于 ...
- 二、添加 Insert into
文档目录 开始使用 初始化查询实例: LambdaToSql.SqlClient DB = new LambdaToSql.SqlClient(); 添加实体数据 ", IP = &quo ...
- Spring Cloud 入门教程 - Eureka服务注册与发现
简介 在微服务中,服务注册与发现对管理各个微服务子系统起着关键作用.随着系统水平扩展的越来越多,系统拆分为微服务的数量也会相应增加,那么管理和获取这些微服务的URL就会变得十分棘手,如果我们每新加一个 ...
- Angular使用总结 --- 模版驱动表单
表单的重要性就不多说了,Angular支持表单的双向数据绑定,校验,状态管理等,总结下. 获取用户输入 <div class="container-fluid login-page&q ...
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- sql server对并发的处理-乐观锁和悲观锁
https://www.cnblogs.com/dengshaojun/p/3955826.html sql server对并发的处理-乐观锁和悲观锁 假如两个线程同时修改数据库同一条记录,就会导致后 ...
- MDF,了解一下
1.MDF定义 MDF,全称(Measurement Data Format),即测量数据格式,是ASAM(自动化及测量系统标准协会)定义的.MDF的网页https://www.asam.net/st ...
- MySQL的日志(一)
本文目录:1.日志刷新操作2.错误日志3.一般查询日志4.慢查询日志5.二进制日志 5.1 二进制日志文件 5.2 查看二进制日志 5.2.1 mysqlbinlog 5.2.2 show binar ...
- Django Push 的一些资料
先来中文的: 主要讲Orbited: http://sunsetsunrising.com/2009/django_comet.html#gsc.tab=0 再来英文的: http://www.rkb ...
- OkHttp上传文件,服务器端请求解析找不到文件信息的问题
长话短说,不深入解释了,官方给的上传案例代码: private static final String IMGUR_CLIENT_ID = "..."; private stati ...