UOJ348. 【WC2018】州区划分

http://uoj.ac/problem/348

分析:

  • 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\)
  • \(f(S)\)表示\(S\)集合内的答案。
  • \(f(S)=\sum\limits_{T\subseteq S,|T|>0}g(T)f(S-T)s(S)\)。
  • 这玩意可以使用占位多项式搞搞。
  • 大概就是形如\(f(S)=\sum\limits_{P|Q=S,|P|+|Q|=S}g(P)h(Q)\)。
  • 多开一维表示\(|S|\)然后暴力卷这一维即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
#define N 2100000
#define mod 998244353
ll f[22][N],g[22][N],A[N],sum[N];
int ea[550],eb[550];
int n,m,p,w[22],CNT[N];
int head[22],to[550],nxt[550],cnt,Q[22],vis[22],du[22];
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
ll qp(ll x,ll y) {
ll re=1; for(;y;y>>=1,x=x*x%mod) if(y&1) re=re*x%mod;
return re;
}
bool check(int s) {
int i;
for(i=1;i<=n;i++) du[i]=head[i]=vis[i]=0; cnt=0;
for(i=1;i<=m;i++) {
if((s&(1<<(ea[i]-1))) && (s&(1<<(eb[i]-1))))
add(ea[i],eb[i]),add(eb[i],ea[i]),du[ea[i]]++,du[eb[i]]++;
}
for(i=1;i<=n;i++) if(du[i]&1) return 0;
int l=0,r=0;
for(i=1;i<=n;i++) if(s&(1<<(i-1))) {
Q[r++]=i; vis[i]=1; break;
}
while(l<r) {
int x=Q[l++];
for(i=head[x];i;i=nxt[i]) if(!vis[to[i]]) {
vis[to[i]]=1; Q[r++]=to[i];
}
}
return r==CNT[s];
}
void fort(ll *a,int len,int flg) {
int i,j,k,t;
for(k=2;k<=len;k<<=1) for(t=k>>1,i=0;i<len;i+=k) for(j=i;j<i+t;j++) {
if(flg==1) a[j+t]=(a[j+t]+a[j])%mod; else a[j+t]=(a[j+t]-a[j])%mod;
}
}
int main() {
scanf("%d%d%d",&n,&m,&p);
int i,j,k;
for(i=1;i<=m;i++) scanf("%d%d",&ea[i],&eb[i]);
for(i=1;i<=n;i++) scanf("%d",&w[i]);
int mask=(1<<n)-1;
for(i=1;i<=mask;i++) {
CNT[i]=CNT[i>>1]+(i&1);
ll re=0;
for(j=1;j<=n;j++) if(i&(1<<(j-1))) {
re+=w[j];
}
g[CNT[i]][i]=qp(re,p); sum[i]=qp(g[CNT[i]][i],mod-2);
if(check(i)) g[CNT[i]][i]=0;
}
for(i=1;i<=n;i++) fort(g[i],1<<n,1);
for(i=0;i<=mask;i++) f[0][i]=1;
for(i=1;i<=n;i++) {
for(j=1;j<=i;j++) {
for(k=0;k<=mask;k++) {
A[k]=(A[k]+g[j][k]*f[i-j][k]);
}
}
for(k=0;k<=mask;k++) A[k]%=mod;
fort(A,1<<n,-1);
for(k=0;k<=mask;k++) {
f[i][k]=A[k]*sum[k]%mod; A[k]=0;
}
if(i<n) fort(f[i],1<<n,1);
}
printf("%lld\n",(f[n][mask]+mod)%mod);
}

UOJ348. 【WC2018】州区划分的更多相关文章

  1. UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积

    传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...

  2. [WC2018]州区划分——FWT+DP+FST

    题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...

  3. [WC2018]州区划分

    [WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...

  4. [UOJ#348][WC2018]州区划分

    [UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...

  5. [WC2018]州区划分(FWT,FST)

    [WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...

  6. P4221 [WC2018]州区划分 无向图欧拉回路 FST FWT

    LINK:州区划分 把题目中四个条件进行规约 容易想到不合法当前仅当当前状态是一个无向图欧拉回路. 充要条件有两个 联通 每个点度数为偶数. 预处理出所有状态. 然后设\(f_i\)表示组成情况为i的 ...

  7. [WC2018]州区划分(FWT)

    题目描述 题解 这道题的思路感觉很妙. 题目中有一个很奇怪的不合法条件,貌似和后面做题没有什么关系,所以我们先得搞掉它. 也就是判断一个点集是否合法,也就是判断这个点集是否存在欧拉回路. 如果存在欧拉 ...

  8. Luogu4221 WC2018州区划分(状压dp+FWT)

    合法条件为所有划分出的子图均不存在欧拉回路或不连通,也即至少存在一个度数为奇数的点或不连通.显然可以对每个点集预处理是否合法,然后就不用管这个奇怪的条件了. 考虑状压dp.设f[S]为S集合所有划分方 ...

  9. 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 ...

  10. [WC2018]州区划分(状压DP+FWT/FMT)

    很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合 ...

随机推荐

  1. 02_虚拟机的安装和SecureCRT、FileZilla、Xmanage、UltraEdit工具的介绍

    上述几个工具连接不成功的情况,很多时候是因为ssh服务没有安装,CentOS默认安装,不会出现问题,Ubuntu桌面版默认没有安装,需要手动安装,安装部分参考下文SecureCRT部分 一.安装Cen ...

  2. 正则表达式----grep

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. grep [参数]  匹配条件  路径  参数 : -n  :显示行号 ...

  3. INSPIRED启示录 读书笔记 - 第7章 管理产品经理

    产品总监的关键职责 1.组建优秀的产品经理团队 如果产品经理不称职,只能退而求其次,请其他团队成员(比如主程序员)越俎代庖 新产品经理必须经过约三个月刻苦学习才能开始管理产品,管理者应该为新人创造学习 ...

  4. JAVA基础补漏--字符串

    字符串常量池 String a="abc"; String b="abc"; char[] str = {"a","b" ...

  5. 关于发邮件报错535 Error:authentication failed&553 authentication is required

    553 authentication is required:这个错误的意思是你必须需要认证. 也就是说,你连接smtp服务器的时候必须使用密码来连接:下面代码红色那句 代码: @Override p ...

  6. MYSQL limit用法

    1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...

  7. Windows命令行乱码问题解决

    命令 chcp功能: 显示或设置活动代码页编号 CHCP [nnn] nnn 指定代码页编号. 不加参数键入 CHCP 显示活动代码页编号. nnn指定一已有的系统字符集,该字符集在CONFIG.SY ...

  8. sql server update时,是行锁还是表锁

    https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 问题: udpat ...

  9. 使用UNIDAC连接oracle时的参数设置

    在uniconnection1里设置: server项位hostip:port:sid,如10.53.x.XX:1521:or10g 然后在Options里设置: charset:utf8 direc ...

  10. 如何用wamp配置多域名虚拟目录

    一.前言 自从重装了最新版wamp64后就不可用了,下面来介绍我的解决方法,两者均可尝试,差别并不大! 二.配置虚拟主机 1.首先打开apache的配置文件httpd.conf (路径\wamp64\ ...