题目大意:

  给一个无向图$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. 关于MySQL 5.6.24 解压缩版重启电脑后,无法启动的问题

    最近的项目需要用到mysql,想起以前安装过,就得应该没啥问题.也不知道是软件更新换代的问题,还是版权问题,网上找的msi版本的mysql都很难安装,一开始要安装.NET,我忍了,然后又要安装Visu ...

  2. CentOS 7.4上安装mysql 8.0

    我的CentOS版本通过从cat /etc/centos-release查看得知 CentOS Linux release 7.4.1708 (Core) 因此需要yum删除mariadb,然后安装m ...

  3. JAVA代码设置selector不同状态下的背景颜色

    代码实现Shape 代码实现Selector StateListDrawable与GradientDrawable 的运用 在Android开发中,我们时常会用到自定义drawable样式,在draw ...

  4. self-sizing cell的一个问题

    如何TableViewCell里面再加上CollectionView这类的ScrollView玩意,那自动算高就失效了,还是得用 override func tableView(_ tableView ...

  5. JavaScript头像上传器的实现

    最近做这方面的东西,刚开始准备用一个开源项目:https://github.com/yueyoum/django-upload-avatar 后来发现这个开源组件的原设计者的定制化选项设计略显复杂,发 ...

  6. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...

  7. JWT实现用户权限认证

    网上的java基础教程曾教会我们,将用户登录信息存在session(服务器端)中,需要验证的时候拿出来作对比以达到身份 验证的效果.但这种方式暴露的问题也是可想而知的: 1.Seesion:每次认证用 ...

  8. C++开发中BYTE类型数组转为对应的字符串

    下午密码键盘返回了一个校验码,是BYTE类型数组,给上层应用返回最好是字符串方式,怎样原样的将BYTE数组转为string串呢?不多说,开动脑筋上手干!!! BYTE格式的数组bt{08,D7,B4, ...

  9. 用js来实现那些数据结构—目录

    首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...

  10. 记录一次坑爹的Python脚本抢购低价手机经历!

    无意间浏览到魅族官网,说魅族3限量100台.30号中午12点抢购.正好我爪机目前处于报废状态,就来一试手气了.11点多种,习惯性的看了下网页脚本,发现了检测是否到抢购时间,并返回抢购消息的ajax.于 ...