题目大意:

  给一个无向图$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. Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决

    在windows平台使用Qt5.8mingw版写出的程序,在Qt中运行正常,而以release的形式编译并且补充完必要的dll文件后,在其他电脑上运行出现了以下问题: 经过查阅许多资料和亲身实验,终于 ...

  2. 二、添加 Insert into

    文档目录 开始使用  初始化查询实例: LambdaToSql.SqlClient DB = new LambdaToSql.SqlClient(); 添加实体数据 ", IP = &quo ...

  3. Spring Cloud 入门教程 - Eureka服务注册与发现

    简介 在微服务中,服务注册与发现对管理各个微服务子系统起着关键作用.随着系统水平扩展的越来越多,系统拆分为微服务的数量也会相应增加,那么管理和获取这些微服务的URL就会变得十分棘手,如果我们每新加一个 ...

  4. Angular使用总结 --- 模版驱动表单

    表单的重要性就不多说了,Angular支持表单的双向数据绑定,校验,状态管理等,总结下. 获取用户输入 <div class="container-fluid login-page&q ...

  5. OO开发思想:面向对象的开发方法(Object oriented,OO)

    面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...

  6. sql server对并发的处理-乐观锁和悲观锁

    https://www.cnblogs.com/dengshaojun/p/3955826.html sql server对并发的处理-乐观锁和悲观锁 假如两个线程同时修改数据库同一条记录,就会导致后 ...

  7. MDF,了解一下

    1.MDF定义 MDF,全称(Measurement Data Format),即测量数据格式,是ASAM(自动化及测量系统标准协会)定义的.MDF的网页https://www.asam.net/st ...

  8. MySQL的日志(一)

    本文目录:1.日志刷新操作2.错误日志3.一般查询日志4.慢查询日志5.二进制日志 5.1 二进制日志文件 5.2 查看二进制日志 5.2.1 mysqlbinlog 5.2.2 show binar ...

  9. Django Push 的一些资料

    先来中文的: 主要讲Orbited: http://sunsetsunrising.com/2009/django_comet.html#gsc.tab=0 再来英文的: http://www.rkb ...

  10. OkHttp上传文件,服务器端请求解析找不到文件信息的问题

    长话短说,不深入解释了,官方给的上传案例代码: private static final String IMGUR_CLIENT_ID = "..."; private stati ...