[cf1326F]Wise Men
对答案序列求一个高维后缀和,再通过差分将其解出,后者复杂度为$o(n2^{n})$
对于求后缀和后的结果,即01序列仅要求1处有边(不要求0处没有边),那么也即要求将原图划分为若干条长度给定且没有公共点的链
不妨先去枚举链的长度,假设为$\{l_{1},l_{2},...,l_{m}\}$,要求满足$l_{1}\le l_{2}\le ...\le l_{m}$且$\sum_{i=1}^{m}l_{i}=n$,记其对应的方案数为$P(n)$即为A000041,也即有$P(18)=385$
下面,问题即要求出对应的方案数,并加到需要贡献的状态上——
状压dp求出$f_{S}$表示$S$中的点构成链的排列数,时间复杂度为$o(n^{2}2^{n})$
构造$g_{i,S}=\begin{cases}0&(|S|\ne i)\\f_{S}&(|S|=i)\end{cases}$,不难发现方案数即为$(\bigcirc_{i=1}^{m}g_{l_{i}})_{V}$(其中$\circ$为或卷积,$V$为点集),先预处理出$g_{i}$做FWT的结果,再$o(2^{n})$求出乘积在$V$处的值,时间复杂度为$o(n^{2}2^{n}+P(n)2^{n})$
对于其有贡献的状态,即将$\{l_{i}\}$重新排列后不同的序列,注意到每一个状态最多统计一次,因此暴力枚举所有排列(不重复)的复杂度也仅为$o(P(n)2^{n})$
综上,总复杂度为$o(n^{2}2^{n}+P(n)2^{n})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N (1<<18)
4 #define L 19
5 #define ll long long
6 vector<int>v;
7 int n,cnt[N],vis[L];
8 ll f[N][L],g[L][N],S[N],SS[L][N],ans[N];
9 char s[L][L];
10 void FWT(ll *a){
11 for(int i=0;i<n;i++)
12 for(int j=0;j<(1<<n);j++)
13 if (j&(1<<i))a[j]+=a[j^(1<<i)];
14 }
15 void get_per(int k,int S,ll s){
16 if (k==v.size()){
17 ans[S]+=s;
18 return;
19 }
20 int lst=0;
21 for(int i=0;i<v.size();i++)
22 if ((!vis[i])&&(lst!=v[i])){
23 vis[i]=1,lst=v[i];
24 get_per(k+1,((S<<v[i])|((1<<v[i]-1)-1)),s);
25 vis[i]=0;
26 }
27 }
28 void dfs(int k,int lst){
29 if (!k){
30 ll s=0;
31 for(int i=0;i<(1<<n);i++)
32 if ((n-cnt[i])&1)s-=S[i];
33 else s+=S[i];
34 get_per(0,0,s);
35 return;
36 }
37 memcpy(SS[k],S,sizeof(S));
38 for(int i=lst;i<=k;i++){
39 v.push_back(i);
40 for(int j=0;j<(1<<n);j++)S[j]*=g[i][j];
41 dfs(k-i,i);
42 v.pop_back();
43 memcpy(S,SS[k],sizeof(S));
44 }
45 }
46 int main(){
47 scanf("%d",&n);
48 for(int i=0;i<n;i++)scanf("%s",s[i]);
49 for(int i=0;i<(1<<n);i++)cnt[i]=cnt[i>>1]+(i&1);
50 for(int i=0;i<n;i++)f[1<<i][i]=1;
51 for(int i=1;i<(1<<n);i++)
52 for(int j=0;j<n;j++)
53 if (i&(1<<j)){
54 g[cnt[i]][i]+=f[i][j];
55 for(int k=0;k<n;k++)
56 if (((i&(1<<k))==0)&&(s[j][k]=='1'))f[i|(1<<k)][k]+=f[i][j];
57 }
58 for(int i=1;i<=n;i++)FWT(g[i]);
59 for(int i=0;i<(1<<n);i++)S[i]=1;
60 dfs(n,1);
61 n--;
62 for(int i=0;i<n;i++)
63 for(int j=0;j<(1<<n);j++)
64 if (j&(1<<i))ans[j^(1<<i)]-=ans[j];
65 for(int i=0;i<(1<<n);i++)printf("%lld ",ans[i]);
66 printf("\n");
67 return 0;
68 }
[cf1326F]Wise Men的更多相关文章
- Codeforces 1326F2 - Wise Men (Hard Version)(FWT+整数划分)
Codeforces 题目传送门 & 洛谷题目传送门 qwq 这题大约是二十来天前 AC 的罢,为何拖到此时才完成这篇题解,由此可见我是个名副其实的大鸽子( 这是我上 M 的那场我没切掉的 F ...
- Bible
001 Love your neighbor as yourself. 要爱人如己.--<旧·利>19:18 002 Resentment kills a foo ...
- MFC9.0 Outlook控件的标题显示无法修改
这是我在开发中遇到的问题,现记录下来,以便帮助你们. 不想看废话的可以只看最后三行,但你会错过很多. 俗话说的好啊,"Wise men learn by other men's mistak ...
- Do not go gentle into that good night
Do not go gentle into that good night By:Dylan Thomas Do not go gentle into that good night,Old ag ...
- MFC9.0 Outlook控件的标题显示无法改动
这是我在开发中遇到的问题,现记录下来,以便帮助你们. 不想看废话的能够仅仅看最后三行,但你会错过非常多. 俗话说的好啊,"Wise men learn by other men's mist ...
- June 7. 2018 Week 23rd Thursday
Half is worse than none at all. 一知半解比一无所知更痛苦. From Westworld. If we go looking for the truth, get th ...
- PMP模拟考试-1
1. A manufacturing project has a schedule performance index (SPI) of 0.89 and a cost performance ind ...
- time is always a factor, time is always now!!!!
https://www.linkedin.com/pulse/time-always-now-joe-alderman ---------------------------------------- ...
- 快速沃尔什变换&快速莫比乌斯变换小记
u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) ...
随机推荐
- 细说JUC的线程池架构
前言 线程的创建是需要JVM和OS(操作系统)相互配合的,一次的创建要花费许多的资源. 1.首先,JVM要为该线程分配堆栈和初始化大量内存块,栈内存至少是1MB. 2.其次便是要进行系统的调用,在OS ...
- 给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资
文章来源|AI科技大本营 作者|伍杏玲 上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮.随后"中国 Linux 第一人& ...
- Server Tools(服务器工具)
服务器工具 1.发布 # Process: MXD 转 Web 地图 arcpy.MXDToWebMap_server("", "", "" ...
- 结对编程——带UI的小初高数学学习软件
一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...
- 微信小程序中路由跳转
一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...
- 3.4 Common Principles 通用原则
3.4 Common Principles 通用原则 Before going into details, let's see some overall DDD principles; 在讨论细节之前 ...
- 解决git clone慢问题
解决git clone慢 关于Git克隆或是上传代码龟速的问题真是让人很恼火,这里对于网上的两种解决方案进行摘录. 利用码云克隆github项目 亲测有效 进入码云,新建一个仓库: 在创建的最后选择导 ...
- JAVA的array中indexOf
记得龙哥有个重构的文章里说直接判断啥的. 今天看JDK ArrayList,看到了他的 indexOf,他先判断,后进入循环,看似写了两遍for 循环,但是简单明了暴力.i like it . pub ...
- [软工顶级理解组] Alpha阶段团队贡献分评分
评分总表 下述表格适用于前端.后端.爬虫开发者的评分,基础分数为50分,在此基础上进行增减. 类别 程度 加减分 准时性 提前完成 +0 按时完成 +0 延后完成,迟交时间一天内或未延误进度 -2 延 ...
- 『学了就忘』Linux基础 — 7、补充:安装Linxu系统时设置硬盘挂载说明
目录 (1)新建一个/home分区 (2)再创建一个/boot分区. (3)创建一个swap分区 (4)最后剩余的空间全部分给根目录 (5)总结 上一篇在VMwar虚拟机中安装Linux操作系统中ht ...