[UOJ348]州区划分
设$f_i$表示选状态为$i$的点的答案,$s_i$表示状态为$i$的点权和,$不存在欧拉回路g_i=[i\,不存在欧拉回路]s_i$
那么$f_i=\sum\limits_{j\subset i}\left(\frac{g_j}{s_i}\right)^pf_{i-j}$
把$s_i$提出来,它是一个子集卷积的形式
直接做会爆,但因为我们在做FST时先把$f_s$FWT成$f_{|s|,s}$再做卷积,所以我们可以先把$f$和$g$FWT,然后子集卷积转移时直接使用FWT后的值,除$s_i^p$时先IFWT再FWT即可,这样总时间复杂度就是$O(n^22^n)$
#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=998244353,maxn=2097152;
int mul(int a,int b){return a*(ll)b%mod;}
int pow(int a,int b){
int s=1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
int N;
void fwt_or(int*a,int on){
int i,j,k;
for(i=2;i<=N;i<<=1){
for(j=0;j<N;j+=i){
for(k=0;k<i>>1;k++)(a[i/2+j+k]+=on*a[j+k])%=mod;
}
}
}
bool c[30][30];
int w[30],s[maxn],inv[maxn],cnt[maxn],f[22][maxn],g[22][maxn],n;
int getsum(int s){
int i,res=0;
for(i=0;i<n;i++){
if(s>>i&1)res+=w[i];
}
return res;
}
int d[30],fa[30];
int get(int x){return x==fa[x]?x:(fa[x]=get(fa[x]));}
void merge(int x,int y){
x=get(x);
y=get(y);
if(x!=y)fa[x]=y;
}
int noeu(int s){
int i,j;
memset(d,0,sizeof(d));
for(i=0;i<n;i++)fa[i]=i;
for(i=0;i<n-1;i++){
if(s>>i&1){
for(j=i+1;j<n;j++){
if((s>>j&1)&&c[i][j]){
d[i]++;
d[j]++;
merge(i,j);
}
}
}
}
j=-1;
for(i=0;i<n;i++){
if(s>>i&1){
if((~j)&&get(i)!=j)return 1;
j=get(i);
}
}
for(i=0;i<n;i++){
if(d[i]&1)return 1;
}
return 0;
}
int main(){
int m,p,i,j,k,x,y,*f,*a,*b;
scanf("%d%d%d",&n,&m,&p);
N=1<<n;
while(m--){
scanf("%d%d",&x,&y);
x--;
y--;
c[x][y]=c[y][x]=1;
}
for(i=0;i<n;i++)scanf("%d",w+i);
for(i=0;i<N;i++)cnt[i]=cnt[i>>1]+(i&1);
for(i=0;i<N;i++){
s[i]=pow(getsum(i),p);
inv[i]=pow(s[i],mod-2);
g[cnt[i]][i]=noeu(i)*s[i];
}
for(i=0;i<=n;i++)fwt_or(g[i],1);
::f[0][0]=1;
fwt_or(::f[0],1);
for(i=1;i<=n;i++){
f=::f[i];
for(j=0;j<i;j++){
a=::f[j];
b=g[i-j];
for(k=0;k<N;k++)(f[k]+=mul(a[k],b[k]))%=mod;
}
fwt_or(f,-1);
for(j=0;j<N;j++){
if(cnt[j]==i)
f[j]=mul(f[j],inv[j]);
else
f[j]=0;
}
if(i!=n)fwt_or(f,1);
}
printf("%d",(f[N-1]+mod)%mod);
}
[UOJ348]州区划分的更多相关文章
- UOJ348. 【WC2018】州区划分
UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...
- UOJ#348. 【WC2018】州区划分
原文链接www.cnblogs.com/zhouzhendong/p/UOJ348.html 前言 第一次知道子集卷积可以自己卷自己. 题解 这是一道子集卷积模板题. 设 $sum[S]$ 表示点集 ...
- [WC2018]州区划分——FWT+DP+FST
题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...
- 【WC2018】州区划分(FWT,动态规划)
[WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...
- [WC2018]州区划分
[WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...
- 「WC2018」州区划分(FWT)
「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...
- [UOJ#348][WC2018]州区划分
[UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...
- P4221 [WC2018]州区划分 无向图欧拉回路 FST FWT
LINK:州区划分 把题目中四个条件进行规约 容易想到不合法当前仅当当前状态是一个无向图欧拉回路. 充要条件有两个 联通 每个点度数为偶数. 预处理出所有状态. 然后设\(f_i\)表示组成情况为i的 ...
- [WC2018]州区划分(FWT,FST)
[WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
随机推荐
- Windows平台下搭建Git服务器的图文教程
Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...
- html中的meta标签
1.定义 meta元素提供页面的原信息,位于文档头部 2.必须的属性 content属性 该属性提供名称/值对中的值,使用要与http-equiv或name属性一起使用 3.可选的属性 3.1.htt ...
- perl6 修改文件并覆盖
use v6; my $filename = 'data.txt'; my $data = slurp $filename; say $data; $data ~~ s/'4'/'ABC'/; say ...
- Python自动化运维 - Django(二)Ajax基础 - 自定义分页
Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...
- Python学习笔记 - day8 - 异常
异常 在程序运行过程中,总会遇到各种各样的错误.有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种 ...
- 调试应用程序(Debugging Applications)
调试应用程序(Debugging Applications)¶ Phalcon中提供了提供了几种调试级别即通知,错误和异常. 异常类 Exception class 提供了错误发生时的一些常用的调试信 ...
- io多路复用-select()
参照<Unix网络编程>相关章节内容,实现了一个简单的单线程IO多路复用服务器与客户端. 普通迭代服务器,由于执行recvfrom则会发生阻塞,直到客户端发送数据并正确接收后才能够返回,一 ...
- HTML5 audio标签自制音乐播放器
相关技能 HTML5+CSS3(实现页面布局和动态效果) Iconfont(使用矢量图标库添加播放器相关图标) LESS (动态CSS编写) jQuery(快速编写js脚本) gulp+webpack ...
- [New learn]GCD的卡死现象分析研究
https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...
- windows下使用github
1.首先到github.com注册用户: 2.下载git,地址:http://pan.baidu.com/s/1skPpWlB(64位下载):http://pan.baidu.com/s/1skOAa ...