题目分析:

这题是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】【欧拉回路】的更多相关文章

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

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

  2. [WC2018]州区划分

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

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

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

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

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

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

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

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

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

  7. UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积

    传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...

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

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

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

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

随机推荐

  1. AngularJS处理服务器端返回的JSON数据的格式问题

    用ng的$http服务发起ajax请求,php返回的JSON数据格式要正确! 一开始我的php页面是这样返回数据的: if($result){ $oid = mysqli_insert_id($con ...

  2. H5的语义化标签(PS: 后续继续补充)

    头部信息 <header></header> 区块标签 <figure> <figcaption>123</figcaption> < ...

  3. Mac 系统占用100g的解决办法

    Mac 关于本机-磁盘管理,如果发现系统占用超过80g以上的小伙伴们可以做以下操作只需要以下4个步骤,轻松降到30g以内!!!!!!!(仅适用于安装了Xcode的小伙伴) 打开Finder,comma ...

  4. 安卓开发:UI组件-Button和EditText

    2.3Button Button继承自TextView,除了通过属性设置按钮样式,还可以通过绑定drawable文件的方式来实现不同样式. 2.3.1按钮样式 新建Activity:ButtonAct ...

  5. Ubuntu下面MySQL的参数文件my.cnf浅析

    前几天刚接手一个MySQL数据,操作系统为Ubuntu 16.04.5 LTS,  数据库版本为5.7.23-0ubuntu0.16.04.1(APT方式安装的MySQL).这个操作系统下的MySQL ...

  6. Mysql中联合索引的最左匹配原则

    在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先. 如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1).(col1,col2); 如果有一 ...

  7. 委托学习总结(一)浅谈对C#委托理解

    初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少 ...

  8. 本地windows下搭建git的本地服务器

    本地windows下搭建git的本地服务器 准备工作: 本地安装java环境,配置环境变量(略) 下载gitblit文件,百度一大堆 开始第一步: 减压gitblit压缩包到某个目录下,比如我在:H: ...

  9. Pycharm 消除波浪线

    转载:https://blog.csdn.net/youyouran12314/article/details/77719261 Pycharm环境下显示 在代码中显示许多波浪线,查看详情显示Spel ...

  10. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...