对答案序列求一个高维后缀和,再通过差分将其解出,后者复杂度为$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的更多相关文章

  1. Codeforces 1326F2 - Wise Men (Hard Version)(FWT+整数划分)

    Codeforces 题目传送门 & 洛谷题目传送门 qwq 这题大约是二十来天前 AC 的罢,为何拖到此时才完成这篇题解,由此可见我是个名副其实的大鸽子( 这是我上 M 的那场我没切掉的 F ...

  2. Bible

    001 Love your neighbor as yourself.         要爱人如己.--<旧·利>19:18      002 Resentment kills a foo ...

  3. MFC9.0 Outlook控件的标题显示无法修改

    这是我在开发中遇到的问题,现记录下来,以便帮助你们. 不想看废话的可以只看最后三行,但你会错过很多. 俗话说的好啊,"Wise men learn by other men's mistak ...

  4. 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 ...

  5. MFC9.0 Outlook控件的标题显示无法改动

    这是我在开发中遇到的问题,现记录下来,以便帮助你们. 不想看废话的能够仅仅看最后三行,但你会错过非常多. 俗话说的好啊,"Wise men learn by other men's mist ...

  6. June 7. 2018 Week 23rd Thursday

    Half is worse than none at all. 一知半解比一无所知更痛苦. From Westworld. If we go looking for the truth, get th ...

  7. PMP模拟考试-1

    1. A manufacturing project has a schedule performance index (SPI) of 0.89 and a cost performance ind ...

  8. time is always a factor, time is always now!!!!

    https://www.linkedin.com/pulse/time-always-now-joe-alderman ---------------------------------------- ...

  9. 快速沃尔什变换&快速莫比乌斯变换小记

    u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) ...

随机推荐

  1. 细说JUC的线程池架构

    前言 线程的创建是需要JVM和OS(操作系统)相互配合的,一次的创建要花费许多的资源. 1.首先,JVM要为该线程分配堆栈和初始化大量内存块,栈内存至少是1MB. 2.其次便是要进行系统的调用,在OS ...

  2. 给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资

    文章来源|AI科技大本营 作者|伍杏玲 上世纪 90 年代初,21 岁大学生 Linus Torvalds 开源 Linux 操作系统,自此掀起全球开源浪潮.随后"中国 Linux 第一人& ...

  3. Server Tools(服务器工具)

    服务器工具 1.发布 # Process: MXD 转 Web 地图 arcpy.MXDToWebMap_server("", "", "" ...

  4. 结对编程——带UI的小初高数学学习软件

    一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...

  5. 微信小程序中路由跳转

    一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...

  6. 3.4 Common Principles 通用原则

    3.4 Common Principles 通用原则 Before going into details, let's see some overall DDD principles; 在讨论细节之前 ...

  7. 解决git clone慢问题

    解决git clone慢 关于Git克隆或是上传代码龟速的问题真是让人很恼火,这里对于网上的两种解决方案进行摘录. 利用码云克隆github项目 亲测有效 进入码云,新建一个仓库: 在创建的最后选择导 ...

  8. JAVA的array中indexOf

    记得龙哥有个重构的文章里说直接判断啥的. 今天看JDK ArrayList,看到了他的 indexOf,他先判断,后进入循环,看似写了两遍for 循环,但是简单明了暴力.i like it . pub ...

  9. [软工顶级理解组] Alpha阶段团队贡献分评分

    评分总表 下述表格适用于前端.后端.爬虫开发者的评分,基础分数为50分,在此基础上进行增减. 类别 程度 加减分 准时性 提前完成 +0 按时完成 +0 延后完成,迟交时间一天内或未延误进度 -2 延 ...

  10. 『学了就忘』Linux基础 — 7、补充:安装Linxu系统时设置硬盘挂载说明

    目录 (1)新建一个/home分区 (2)再创建一个/boot分区. (3)创建一个swap分区 (4)最后剩余的空间全部分给根目录 (5)总结 上一篇在VMwar虚拟机中安装Linux操作系统中ht ...