博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UOJ348]州区划分
阅读量:6959 次
发布时间:2019-06-27

本文共 1298 字,大约阅读时间需要 4 分钟。

设$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
#include
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
>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
>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
>i&1){ for(j=i+1;j
>j&1)&&c[i][j]){ d[i]++; d[j]++; merge(i,j); } } } } j=-1; for(i=0;i
>i&1){ if((~j)&&get(i)!=j)return 1; j=get(i); } } for(i=0;i
>1]+(i&1); for(i=0;i

转载于:https://www.cnblogs.com/jefflyy/p/9365016.html

你可能感兴趣的文章
初次接触博客园
查看>>
python Super
查看>>
操作变量实际是通过地址来操作内存空间
查看>>
一些总结
查看>>
在windows 系统中搭建Python编程环境
查看>>
Javascript 引用类型
查看>>
webpack4 打包多页面应用
查看>>
[PAT乙级题解]——试密码
查看>>
Python 正则处理_re模块
查看>>
JavaScript获取浏览器语言
查看>>
CodeForces 590A Median Smoothing
查看>>
linux下查看运行进程详细信息
查看>>
[转载] 财经郎眼20120109:蒙牛的秘密
查看>>
[转载] 羽毛球——学打羽毛球 04 正手发高远球
查看>>
xen之基本搭建
查看>>
express框架中如何只执行一次res响应操作
查看>>
Entity Framework 延伸系列目录
查看>>
【总结整理】WebGIS学习-thinkGIS(二):关于level,比例尺scale,分辨率resolution...
查看>>
NOIP2005过河(青蛙过河)
查看>>
团队项目计划BACKLOG
查看>>