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-S]^p}$
$f[S] = \sum_{T \subset S}d[S-T]*h[T]$
总数等于$f[All]$
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ;
const int mod = ; int n,m,p,f[maxn][(<<)+],g[(<<)+],d[maxn][(<<)+],ng[maxn][maxn];
int iv[(<<)+],popcnt[(<<)+],w[maxn]; int fast_pow(int now,int pw){
int ans = ,dt = now,bit = ;
while(bit <= pw){
if(bit & pw){ans = 1ll*ans*dt%mod;}
dt = 1ll*dt*dt%mod; bit<<=;
}
return ans;
} void read(){
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<(<<n);i++) popcnt[i] = popcnt[i>>]+(i&);
for(int i=;i<=m;i++){
int u,v; scanf("%d%d",&u,&v);
ng[u][v] = ng[v][u] = ;
}
for(int i=;i<=n;i++) scanf("%d",&w[i]);
} void dp(int now){
if(g[now] || now == ) return;
dp(now-(now&-now));
g[now] = g[now-(now&-now)];
for(int i=;i<=n;i++) if((<<i-)&(now&-now)) g[now] += w[i];
} queue<int> q;int arr[maxn];
int chk(int now){
for(int i=;i<n;i++) if(now&(<<i)){arr[i+]=now;q.push(i+);break;}
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<=n;i++){
if(!(now&(<<i-)) || !ng[k][i] || arr[i]==now) continue;
arr[i] = now; q.push(i);
}
}
for(int i=;i<=n;i++) if(now&(<<i-)) if(arr[i]!=now) return ;
for(int i=;i<=n;i++){
if(!(now&(<<i-))) continue;
int cnt = ;
for(int j=;j<=n;j++){if((now&(<<j-))&&ng[i][j]) cnt++;}
if(cnt & ) return ;
}
return ;
} void FMT(int *A){
for(int i=;i<(<<n);i<<=)
for(int j=;j<(<<n);j+=(i<<))
for(int k=;k<i;k++) {
A[j+k+i] += A[j+k];
if(A[j+k+i] >= mod) A[j+k+i] -= mod;
}
} void IFMT(int *A){
for(int i=(<<n-);i>=;i>>=)
for(int j=;j<(<<n);j+=(i<<))
for(int k=;k<i;k++){
A[j+k+i] -= A[j+k];
if(A[j+k+i] < ) A[j+k+i] += mod;
}
} void init(){
for(int i=;i<(<<n);i++) dp(i);
for(int i=;i<(<<n);i++){if(p==)g[i]=;else if(p==)g[i]=g[i]*g[i];}
for(int i=;i<(<<n);i++) iv[i] = fast_pow(g[i],mod-);
for(int i=;i<(<<n);i++){
if(chk(i)) continue; // if it's Euler Graph
int z = ,p = i; while(p) {if(p&)z++;p>>=;}
d[z][i] = g[i];
}
for(int i=;i<=n;i++)
FMT(d[i]);
for(int i=;i<(<<n);i++) f[][i] = iv[(<<n)-];
} void work(){
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
for(int k=;k<(<<n);k++){
f[i][k] += 1ll*f[j][k]*d[i-j][k]%mod;
if(f[i][k] >= mod) f[i][k] -= mod;
}
}
IFMT(f[i]);
if(i < n){
for(int j=;j<(<<n);j++){
if(popcnt[j] != i) f[i][j] = ;
else{f[i][j] = 1ll*f[i][j]*iv[(<<n)-j-]%mod;}
}
FMT(f[i]);
}
}
printf("%d\n",f[n][(<<n)-]);
} int main(){
read();
init();
work();
return ;
}
LOJ2340 [WC2018] 州区划分 【FMT】【欧拉回路】的更多相关文章
- P4221 [WC2018]州区划分 无向图欧拉回路 FST FWT
LINK:州区划分 把题目中四个条件进行规约 容易想到不合法当前仅当当前状态是一个无向图欧拉回路. 充要条件有两个 联通 每个点度数为偶数. 预处理出所有状态. 然后设\(f_i\)表示组成情况为i的 ...
- [WC2018]州区划分
[WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...
- [WC2018]州区划分——FWT+DP+FST
题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...
- [WC2018]州区划分(FWT,FST)
[WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
- [UOJ#348][WC2018]州区划分
[UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...
- [WC2018]州区划分(状压DP+FWT/FMT)
很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合 ...
- UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积
传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...
- [WC2018]州区划分(FWT)
题目描述 题解 这道题的思路感觉很妙. 题目中有一个很奇怪的不合法条件,貌似和后面做题没有什么关系,所以我们先得搞掉它. 也就是判断一个点集是否合法,也就是判断这个点集是否存在欧拉回路. 如果存在欧拉 ...
- Luogu4221 WC2018州区划分(状压dp+FWT)
合法条件为所有划分出的子图均不存在欧拉回路或不连通,也即至少存在一个度数为奇数的点或不连通.显然可以对每个点集预处理是否合法,然后就不用管这个奇怪的条件了. 考虑状压dp.设f[S]为S集合所有划分方 ...
随机推荐
- 下载Dynamics 365 Customer Engagement 工具
微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...
- 基于GIS的视频管理指挥平台
平台利用空间地理信息技术,以GIS地图为基础,将各类信息空间化.可视化,实现基于空间电子地图的可视化查询和分析,它能使情报.推理.分析与其他可用数据融为一体,提供依托于电子地图的清晰而精确的现场态势图 ...
- Rxjs常用operators
本文使用的是angular6内置的rxjs,版本号为6.3.3 concat 通过顺序地发出多个 Observables 的值将它们连接起来,一个接一个的. 参数: 名称 类型 属性 描述 other ...
- C++ 虹软人脸识别 ArcFace 2.0 Demo
环境配置: 开发环境:Win10 + VS 2013 SDK版本:ArcFace v2.0 OpenCV版本:2.4.9 平台配置: x64.x86下Release.Debug SDK 下载地址:戳这 ...
- 【案例分享】crontab执行脚本异常问题
很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了crontab里面执行,结果,不管怎么配置,就是执行不正常. 结果发现环境问题,居然是这个异常的元凶. 我们先在我们 ...
- java-----理解java的三大特性之多态
的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...
- css实现单行(多行)文本溢出显示 ...
overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 当然还需要加宽度width属来兼容部分浏览. 以上为单行文本溢出===== ...
- redis分页摘抄
Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注) 分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页 ...
- 搭建vue.js环境
一.安装Node.js (以下安装环境均为win10) 下载链接:https://nodejs.org/en/download/ 官网给出了两个版本,LTS和Curren.字面意思是推荐大多数用户使用 ...
- shell 脚本中执行sql
#!/bin/bashsql='show databases' result=`mysql -uroot -pengine2user -h127.0.0.1 -e "${sql}" ...