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

就设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. Session session = connection.createSession(paramA,paramB);参数解析

    Session session = connection.createSession(paramA,paramB); paramA是设置事务,paramB是设置acknowledgment mode ...

  2. SQLServer查询计划

    参考:http://blog.csdn.net/luoyanqing119/article/details/17022649 1. 开启方式 菜单栏:query---Display Estimated ...

  3. Jenkins+VS项目持续集成

    软件安装 安装包下载连接:https://jenkins.io/download/ 安装步奏:略 账户名:admin 密码:C:\Program Files (x86)\Jenkins\secrets ...

  4. 英语口语练习系列-C15-心情不好

    单词 1. artist [ˈɑ:tɪst] n. 艺术家 a great artist 一名伟大的艺术家 a Chinese artist 一名中国艺术家 2. beef [bi:f] n. 牛肉 ...

  5. SAP PS 模块,项目、WBS与网络作业概念

    项目定义 项目定义是项目的唯一标识.通过项目定义,决定了包含于其中的所有WBS元素的组织结构.计划方法.预算方式以及结算方法等信息.而项目定义中的数据,则主要来源于“项目参数文件”,所以创建项目定义时 ...

  6. Error:Execution failed for task ':app:processDebugManifest'. Manifest merger failed with multiple errors, see logs

    这个异常在网上一搜会出现很多答案,也可能都对. 我都尝试过但是不符合我这边的要求,问题得不到解决.网上的说法是对的,jar包冲突.不过究竟是哪里冲突没办法判断. 最后尝试了一下在module的中没用的 ...

  7. git 入门(转)

    1. good https://github.com/521xueweihan/git-tips Git的奇技淫巧 2.如果之前未使用过 Git,可以学习 Git 小白教程入门 3.思维导图

  8. vue 中使用jquery

    vue-cli搭建的项目 第一种方式:npm 引包的方式 1.安装jquery npm install jquery --save 2.webpack配置 在项目根目录下的build目录下找到webp ...

  9. TypeError: sequence item 1: expected str instance, int found

    Error Msg Traceback (most recent call last): File "E:/code/adva_code/my_orm.py", line 108, ...

  10. 软工+C(2): 分数和checklist

    // 上一篇:题目设计.点评和评分 // 下一篇:超链接 教学里,建立清晰明确的评分规则并且一开始就公布,对于教师.助教.学生都是重要的. 公布时机 在课程开始的时候,就需要确定并公布评分机制,随着课 ...