[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\) ...
随机推荐
- 题解 Beautiful Pair
题目传送门 题目大意 给出一个 \(n\) 个点的序列 \(a_{1,2,...,n}\) ,问有多少对点对 \((i,j)\) 满足 \(a_i\times a_j\le a_k(i\le k\le ...
- 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析
SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...
- Pandas核心用法
目录 Numpy和Pandas Numpy科学计算 Pandas数据分析 安装jupyter notebook Numpy语法 创建和基本使用 切片索引 布尔索引 对位运算 矩阵的乘除 其他方法 Pa ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- vcs(UST)Undefined System Task Call
转载:VCS求助啊 - 微波EDA网 (mweda.com) Error-[UST] Undefined System Task Call../../path/bench/path.v, 51Unde ...
- Python 语法错误 except Exception, e: ^ SyntaxError: invalid syntax
出这个问题是因为python2和python3 语法有些不同 python2 和 3 处理 except 子句的语法有点不同,需要注意: Python2 try: print ("hello ...
- 恶意代码の奇客pdf分析
目录 恶意代码の奇客pdf分析 奇客PDF安装包分析 静态分析基础技术 上传杀毒网 查壳 编译时间 导入表分析 资源查看 动态分析基础技术 Process Monitor监控 Process Expl ...
- python教程-(四)当索引行不通时(python字典)
一.创建和使用字典 1.函数dict #字典表示方式如下 >>> phonebook = {'tom':'18616271234',"Jim":"186 ...
- Matlab 中 arburg 函数的理解与实际使用方法
1. 理解 1.1 Matlab 帮助: a = arburg(x,p)返回与输入数组x的p阶模型相对应的归一化自回归(AR)参数. 如果x是一个向量,则输出数组a是一个行向量. 如果x是矩阵,则参数 ...
- C++ pragma once 与 ifndef 用法区别
#pragma once 与 #ifndef 的作用 (1)在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性. (2)在能够支持这两种方式的编译器上,二者并没有太大的 ...