[WC2018]州区划分

注意审题:

1.有序选择

2.若干个州

3.贡献是州满意度的乘积

枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0

存在欧拉回路:每个点都是偶度数,且图连通(dfs验证)

然后愉快子集卷积即可。

PS:
FMT辣鸡,

FWT可以节省一倍的常数!这样才能通过此题

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=;
const int mod=;
int n,m,p;
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int ad(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
int f[N][<<];
int g[N][<<];
int w[N],sum[<<];
int sz[<<];
int to[N];
void FWT(int *f,int n){
for(reg p=;p<=n;p<<=){
for(reg l=;l<n;l+=p){
for(reg k=l;k<l+p/;++k){
f[k+p/]=ad(f[k],f[k+p/]);
}
}
}
}
void IFWT(int *f,int n){
for(reg p=;p<=n;p<<=){
for(reg l=;l<n;l+=p){
for(reg k=l;k<l+p/;++k){
f[k+p/]=ad(f[k+p/],mod-f[k]);
}
}
}
}
int val(int v){
// cout<<" bv "<<v<<endl;
return p==?:(p==?v:(ll)v*v%mod);
}
int tot;
int vis[N];
int inv[];
void dfs(int x,int s){
// cout<<" x "<<x<<" s "<<s<<endl;
vis[x]=;
++tot;
for(reg i=;i<n;++i){
if((!vis[i])&&(s&(<<i))&&(to[x]&(<<i))){
dfs(i,s);
}
}
}
int main(){
rd(n);rd(m);rd(p);
int x,y;
inv[]=;
for(reg i=;i<=;++i){
inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
}
for(reg i=;i<=m;++i){
rd(x);rd(y);--x;--y;
to[x]|=(<<y);to[y]|=(<<x);
} for(reg i=;i<n;++i){
rd(w[i]);
}
for(reg i=;i<(<<n);++i){
sz[i]=sz[i>>]+(i&);
for(reg j=;j<n;++j){
if(i&(<<j)) sum[i]+=w[j];
}
}
// cout<<" pre 1"<<endl;
for(reg s=;s<(<<n);++s){
int ji=;
tot=;
memset(vis,,sizeof vis); dfs((__builtin_ctz(s&(-s))),s);
// cout<<" s "<<s<<" "<<__builtin_ctz(s&(-s))<<" tot "<<tot<<endl;
// cout<<" tot "<<tot<<" sz "<<sz[s]<<endl;
if(tot!=sz[s]) ji=;
for(reg i=;i<n;++i){
if(s&(<<i)){
ji+=(sz[to[i]&s]&);
}
}
// cout<<" ss "<<s<<" ji "<<ji<<endl;
if(ji>){
// cout<<" val "<<val(sum[s])<<endl;
g[sz[s]][s]=val(sum[s]);
}
}
for(reg i=;i<(<<n);++i){
f[][i]=;
}
// return 0;
// cout<<" built "<<endl;
for(reg i=;i<=n;++i){
FWT(g[i],(<<n));
// prt(g[i],0,(1<<n)-1); for(reg j=;j<=i;++j){
for(reg s=;s<(<<n);++s){
f[i][s]=ad(f[i][s],(ll)g[j][s]*f[i-j][s]%mod);
}
}
IFWT(f[i],(<<n));
// prt(f[i],0,(1<<n)-1);
for(reg s=;s<(<<n);++s){
// if(sz[s]==i)
f[i][s]=(ll)val(inv[sum[s]])*f[i][s]%mod;
// else f[i][s]=0;
}
if(i!=n) FWT(f[i],(<<n));
}
printf("%d",f[n][(<<n)-]);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/4/13 19:58:12
*/

[WC2018]州区划分的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj5153 [Wc2018]州区划分

    题目链接 正解:子集和变换. 考场上只会暴力和$p=0$的情况,还只会$O(2^{n}*n^{3})$的. 然而这题题面出锅,导致考场上一直在卡裸暴力,后面的部分分没写了..听$laofu$说$O(2 ...

随机推荐

  1. 自己用习惯的idea快捷键笔记

    Ctrl + Space 自动完成(win10下冲突不能用,自己换成 Alt + \ ) 切换方法是菜单中依次打开 file -> settings -> keymap,搜索complet ...

  2. WSL Windows subsytem linux 的简单学习与使用

    1. win10 1709 以上的版本应该都增加上了 ctrl +r 运行 winver 查看版本 2. 添加删除程序 增加 wsl 增加一个功能 3. 打开cmd 输入 bash 即可 4. 可以将 ...

  3. spring AOP的用法

    AOP,面向切面编程,它能把与核心业务逻辑无关的散落在各处并且重复的代码给封装起来,降低了模块之间的耦合度,便于维护.具体的应用场景有:日志,权限和事务管理这些方面.可以通过一张图来理解下: Spri ...

  4. springboot+ELK+logback日志分析系统demo

    之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...

  5. Hbase存储思想

  6. Python学习之路——Day06 元组

    一.元组 t1 = (1, 2) t2 = tuple((1, 2)) t3 = (1, ) # 索引 | 切片 | 长度 # .count(obj) | .index(obj, bIndex, eI ...

  7. Android与H5交互 原理与对比

    原文:  https://www.jianshu.com/p/345f4d8a5cfa 1.Android调用JS的方法有2种: (1)通过WebView的loadUrl() // 调用js中的函数: ...

  8. mysql,mybatis模糊查询

    <if test="deviceType != null and deviceType != ''">and device_type like CONCAT('%', ...

  9. POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null;                                                                     ...

  10. 微信小程序——使用vue构建小程序【外传】

    文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~