题目大意:

  给一个无向图$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」州区划分的更多相关文章

  1. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  2. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  3. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  4. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  5. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  6. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  7. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  8. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  9. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

随机推荐

  1. matlab GUI保存axes(坐标轴)上的图像

    1.默认方式 matlab GUI默认菜单的保存图像默认为保持全部GUI,包括使用" 菜单->编辑->复制图形". 2 保存可见区域 2.1 代码 [FileName, ...

  2. IT轮子系列(三)——如何给返回类型添加注释——Swagger的使用(二)

    前言 一般对外提供API,都会统一一个返回类型,比如所有的接口都统一返回HttpResponseMessage.这样当我们在方法上添加///注释时,是无法清楚的知道都返回字段都又那些以及它们的数据类型 ...

  3. iOS 博客资源精选

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  4. LAMP的搭建

    可以在网上找整合包: httpd-2.4.18 + mysql-5.6.29 + php-5.5.30编译安装过程: 编译源代码后安装软件的位置:/usr/local/ 一.编译安装apache ap ...

  5. 爬虫初探--PHP

    我有收藏的cms网站,偶尔会下载一些资源,老司机都懂的:-D.然后有一次好几天没上,堆了好些没弄,心想:cao,这好麻烦啊,能不能写个脚本自动帮我搞?然后忽然就想到,这是不是就是所谓的爬虫呢?心中一阵 ...

  6. centos7虚拟机设置静态ip

    cd /etc/sysconfig/network-scripts/ vi ifcfg-enp0s3 1.修改配置 BOOTPROTO=static2.新增配置(查询宿主机对应的信息) IPADDR= ...

  7. SpringBoot整合Kafka和Storm

    前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...

  8. java 字符串池【转】

    java 字符串池 java运行环境有一个字符串池.比如String str="abc"时,会首先查看字符串池中是否存在字符串"abc",如果存在则直接将&qu ...

  9. 微信授权、获取用户openid-纯前端实现——jsonp跨域访问返回json数据会报错的纯前端解决办法

    近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活. 首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url https ...

  10. Jupyter-notebook 导出时不显示Input[]代码

    参考: https://stackoverflow.com/questions/34818723/export-notebook-to-pdf-without-code    1. 第一个方式是直接在 ...