对答案序列求一个高维后缀和,再通过差分将其解出,后者复杂度为$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. B - Ancient Cipher POJ - 2159 解题报告

    内容: Ancient Roman empire had a strong government system with various departments, including a secret ...

  2. PTA实验7-2-3 求矩阵的局部极大值 (15分)

    实验7-2-3 求矩阵的局部极大值 (15分) 给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值.本题要求给定矩阵的全 ...

  3. 更好的 java 重试框架 sisyphus 背后的故事

    sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...

  4. git GUI Clients

    git GUI Clients Git 自带用于提交 (git-gui) 和浏览 (gitk) 的内置 GUI 工具,但也有一些第三方工具供寻求特定平台体验的用户使用. References Git ...

  5. 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树

    解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...

  6. Java:static关键字小记

    Java:static关键字小记 对 Java 中的 static 关键字,做一个微不足道的小小小小记 static 修饰变量 静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不 ...

  7. 技术博客--微信小程序canvas实现图片编辑

    技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...

  8. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  9. 如何使用原生的Ribbon

    什么是Ribbon 之前分析了如何使用原生的Feign,今天我们来研究 Netflix 团队开发的另外一个类库--Ribbon. Ribbon 和 Feign 有很多相似的地方,首先,它们本质上都是 ...

  10. triangle leetcode C++

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...