题目分析:

这题是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. 免费开源ERP Odoo实施指南 连载二:POSTGRESQL概述

    PostgreSQL是Odoo支持的数据库.PostgreSQL是起源于大学的一个历史很长的开源数据库系统.包括美国航天局NASA.德国证券交易中心.中国的平安.腾讯的微信支付.阿里巴巴的阿里云都在用 ...

  2. Belgrade Azure 2019-2-11活动感悟

    这是<国外线下技术俱乐部建设>系列文章之一.   活动网址:https://www.meetup.com/Azure-UG-Srbija/events/258673179/ 活动内容:Az ...

  3. SpringBoot的自动配置原理过程解析

    SpringBoot的最大好处就是实现了大部分的自动配置,使得开发者可以更多的关注于业务开发,避免繁琐的业务开发,但是SpringBoot如此好用的 自动注解过程着实让人忍不住的去了解一番,因为本文的 ...

  4. Java内存管理的进一步理解-模拟过程图解

    Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      ...

  5. 操作DataTable数据,修改某列的值

    DataTable table : DataRow row=table.Rows[i];//DataTable的第i行 row.BeginEdit();//开始编辑行 row["column ...

  6. Git常用命令集锦

    本篇Git命令博客主要是一些Git常用命令,适合于有一定Git或linux基础的小伙伴进行参考 1.新建文件夹 mkdir 文件夹名 2.查看目录机构: pwd 3.将文件添加至Git管理范围:git ...

  7. Django REST framework基础:分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...

  8. Python开发【字符串格式化篇】

    1.百分号 __author__ = "Tang" # + 号 拼接 msg = "i am " + " tang" print(msg) ...

  9. Java之匿名内部类详解

    前言 本文讲解Java中最后一种内部类,叫做匿名内部类.顾名思义,所谓的匿名内部类就是一个没有显式的名字的内部类,在实际开发中,此种内部类用的是非常多的. 匿名内部类 本质:匿名内部类会隐式的继承一个 ...

  10. AQS框架源码分析-AbstractQueuedSynchronizer

    前言:AQS框架在J.U.C中的地位不言而喻,可以说没有AQS就没有J.U.C包,可见其重要性,因此有必要对其原理进行详细深入的理解. 1.AQS是什么 在深入AQS之前,首先我们要搞清楚什么是AQS ...