解:有一个很显然的状压......

就设f[s]表示选的点集为s的时候所有方案的权值和。

于是有f[s] = f[s \ t] * (sum[t] / sum[s])P

这枚举子集是3n的。

然后发现这是子集卷积,参考资料

于是就FWT搞一下...看代码

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = , M = , MO = ; struct Edge {
int v, u;
}edge[N * N]; int w[N], sum[M], cnt[M], n, P, lm, invsum[M], pw[M], in[N], fa[N];
int f[N][M], g[N][M];
bool vis[M]; int find(int x) {
if(x == fa[x]) return x;
return fa[x] = find(fa[x]);
} inline void out(int x) {
for(int i = ; i < n; i++) {
printf("%d", (x >> i) & );
}
return;
} inline void merge(int x, int y) {
fa[find(x)] = find(y);
return;
} inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} inline int pow(int x) {
return P ? (P == ? x : 1ll * x * x % MO) : ;
} inline void FWT_or(int *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
(a[i + len + j] += f * a[i + j]) %= MO;
if(a[i + len + j] < ) a[i + len + j] += MO;
}
}
}
return;
} int main() {
int m;
scanf("%d%d%d", &n, &m, &P); for(int i = , x, y; i <= m; i++) {
scanf("%d%d", &edge[i].v, &edge[i].u);
}
for(int i = ; i <= n; i++) scanf("%d", &w[i]);
lm = ( << n) - ; /// lm = 1111111111(2)
for(int i = ; i <= lm; i++) pw[i] = pw[i >> ] + ;
for(int s = ; s <= lm; s++) {
cnt[s] = cnt[s ^ (s & (-s))] + ;
vis[s] = ;
memset(in + , , n * sizeof(int));
for(int i = ; i <= n; i++) {
fa[i] = i;
}
for(int i = ; i <= m; i++) {
if(((s >> (edge[i].v - )) & ) && ((s >> (edge[i].u - )) & )) {
in[edge[i].v]++;
in[edge[i].u]++;
merge(edge[i].u, edge[i].v);
}
}
bool nol = ;
int temp = ;
for(int i = ; i <= n; i++) {
if(in[i] & ) {
vis[s] = ;
}
if((s >> (i - )) & ) {
(sum[s] += w[i]) %= MO;
if(!temp) {
temp = find(i);
}
else if(find(i) != temp) {
nol = ;
}
}
}
if(nol) vis[s] = ;
invsum[s] = qpow(sum[s], MO - );
if(vis[s]) {
g[cnt[s]][s] = pow(sum[s]);
}
} f[][] = ;
for(int i = ; i <= n; i++) {
FWT_or(g[i], lm + , );
}
FWT_or(f[], lm + , );
for(int i = ; i <= n; i++) {
for(int j = ; j <= i; j++) {
for(int s = ; s <= lm; s++) {
(f[i][s] += 1ll * f[i - j][s] * g[j][s] % MO) %= MO;
}
}
FWT_or(f[i], lm + , -);
for(int s = ; s <= lm; s++) {
f[i][s] = 1ll * f[i][s] * pow(invsum[s]) % MO;
}
if(i < n) FWT_or(f[i], lm + , );
}
printf("%d\n", f[n][lm]);
return ;
}

AC代码

UOJ#348 州区划分的更多相关文章

  1. UOJ #348 州区划分 —— 状压DP+子集卷积

    题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...

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

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

  3. UOJ#348. 【WC2018】州区划分

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ348.html 前言 第一次知道子集卷积可以自己卷自己. 题解 这是一道子集卷积模板题. 设 $sum[S]$ 表示点集 ...

  4. UOJ348. 【WC2018】州区划分

    UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...

  5. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...

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

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

  7. [WC2018]州区划分

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

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

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

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

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

随机推荐

  1. Nodejs 操作 Sql Server

    Nodejs 操作 Sql Server Intro 最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据. ...

  2. gitbook 入门教程之实用插件(新增3个插件)

    插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...

  3. ES6使用的一些方法

    查找数组中符合条件的所有记录 var list=[ {id:1,name:"张三"}, {id:2,name:"李四"}, {id:3,name:"王 ...

  4. 对于windows操作系统磁盘访问权限修改的手残教训

    最近公司新配置的win10电脑,由于测试关于windows系统上项目的安装程序时默认使用了c盘安装,发现安装后的项目不是崩溃就是运行没结果的,偶然间发现同一个安装程序在d盘或其他非系统盘安装则正常.很 ...

  5. 统计 flv视频总时长

    在学习孟媛的视频课程.网上能下载的是flv格式.那我在学习之前,我要统计一下这个课程的数量,他会用多长时间,这样方便我在学习过程中不断的回顾,进行时间管理.我大概就可以统计出来这个视频多长时间可以学完 ...

  6. Bootstrap -- 导航栏样式、分页样式、标签样式、徽章样式

    Bootstrap -- 导航栏样式.分页样式.标签样式.徽章样式 1. 使用图标的导航栏 使用导航栏样式: <!DOCTYPE html> <html> <head&g ...

  7. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  8. git添加/删除远程仓库

    注意:仓库只有管理员建的你才有权限上传,不然自己建的也没用,没权限上传 1.远程仓库路径查询 git remote -v 2.添加远程仓库 git remote add origin <你的项目 ...

  9. 文本分类实战(三)—— charCNN模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  10. day 12 装饰器

    nonlocal关键字 # 作用:将 L 与 E(E中的名字需要提前定义) 的名字统一​# 应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值​# 案例:​def outer():    n ...