[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的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
随机推荐
- MySQL 表和库删不掉,并且表也打不开,不能导出的情况
linux上的mysql中,最近遇到表和库删不掉,并且表也打不开,不能导出的情况. 在删除数据库时,出现以下错误: ERROR 1010 (HY000): Error dropping databas ...
- velocity & freemarker
一.Velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的 ...
- eclipse执行maven install命令时跳过test
在pom.xml里面配置一下代码,将跳过test. <plugins> <plugin> <groupId>org.apache.maven.plugins< ...
- 双内网渗透代理之reGeorg+Proxifier
由于这个工具第一次体验感觉还不错,很稳定.因此在这记录一下reGeorg+Proxifier的配置及其使用. 下载地址 :https://github.com/sensepost/reGeorg.gi ...
- 【Python学习笔记】colormap的参数及其对应的色条
- linux中断线程化分析【转】
转自:http://blog.csdn.net/qq405180763/article/details/24120895 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在为3.8版本的Li ...
- 深度解析Python动态语言
1.动态语言的定义 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结 ...
- 在写一次epoll
epoll & select & poll只能处理IO相关的操作,epoll每一个操作必须注册到时间监控机制中,并且还需要进程或者线程进行管理. 多进程/多线程 和epoll相比较 e ...
- LeetCode解题报告—— Number of Islands & Bitwise AND of Numbers Range
1. Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of island ...
- hdu 1133(卡特兰数变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133 题意:排队买50块一张的票,初始票台没有零钱可找,有m个人持有50元,n人持有100元, ...