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集合所有划分方 ...
随机推荐
- git克隆github上的代码(整个分支),并使用vs code上传到github
好久没写博客辣,之前一直用sublime text3,最近开始用vc写,感觉很良好.然后公司也在用git,就写一个克隆上传的教程吧 1.下载git https://www.git-scm.com/do ...
- <5>Python的uwsgi web服务器
一.是什么? uWSGI是web服务器,用来部署线上web应用到生产环境.uWSGI实现了WSGI协议.uwsgi协议.http协议.WSGI(Web Server Gateway Interface ...
- Python使用Plotly绘图工具,绘制气泡图
今天来讲讲如何使用Python 绘图工具,Plotly来绘制气泡图. 气泡图的实现方法类似散点图的实现.修改散点图中点的大小,就变成气泡图. 实现代码如下: import plotly as py i ...
- 预置第三方apk到MTK项目相关问题总结
目前5.0之后项目预置方式通用步骤为: 建立apk文件夹; 置目标apk到该文件夹下; 解压缩apk查看是否包含lib/文件夹(apk项目是否包含lib库文件); 在该文件夹下编写Androi ...
- asp.net core 2.1 部署 centos7
asp.net core 2.1 部署 centos7 Kestrel 非常适合从 ASP.NET Core 提供动态内容. 但是,Web 服务功能不像服务器(如 IIS.Apache 或 Nginx ...
- python进阶之正则表达式
概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的? 给定一个正则表 ...
- 文本分类实战(七)—— Adversarial LSTM模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- POJ3686 The Windy's
嘟嘟嘟 刚做费用流,思路完全不对呀-- 应该这么想(应该说敢这么想):这道题的关键在于怎么体现这个玩具是第几个加工的,只有这才能求出他的加工时间(因为加工时间包括等待时间). 但等待时间不好求,因此要 ...
- (十一)Updating Documents
In addition to being able to index and replace documents, we can also update documents. Note though ...
- 函数rand,randn,randi
1,rand 生成均匀分布的伪随机数.分布在(0~1)之间主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数rand(m,n,‘double’)生成指定精度的均匀分布的伪随机数,参数还可以是 ...