通化市网站建设_网站建设公司_后端开发_seo优化
2026/1/16 21:58:52 网站建设 项目流程

计数神题。

题目链接

前言

这篇题解没有什么特别的,纯粹是快速题解区变换。仅在一些地方加上了自己的理解,希望会有所帮助。

做本题之前,可以先看看P6846 [CEOI 2019] Amusement Park,可能会有所启发。

解题思路

DP(其一)

看到这道题的点很少,考虑数位DP,但是发现强连通很难刻画,因此考虑正难则反,去刻画非强连通。

何为非强连通?就是对着所有SCC进行缩点后,最后形成了DAG。这里再明确一下DAG的定义:DAG并不需要保证连通,只要有向无环就好了。

然后DAG存在一个性质。就是DAG可以一层层“拨开”,即每次挑选出入度为 0 的点,删去,剩下的点依然会形成DAG。

定义 \(dp_S\) 为点集 \(S\) 的答案(不可行的),\(E_{S,T}\) 表示从 \(S\) 连向 \(T\) 的边数。

那么先想到 \(dp_S = \sum_{T \subseteq S} dp_{S-T} \times 2^{E_{T,S-T}}\),即在原先的基础上,再添加上一层新的入度为 0 的点。但是发现在这个过程中,很可能这个 \(2^{E_{T,S-T}}\) 会一些入度为 0 的点,导致重复,因此考虑改写式子。

定义 \(g_T\) 表示 \(T\) 内的点入度为 0\(f_T\) 表示恰好 \(T\) 内点入度为 0,显然可以得到\(g_T = dp_{S-T} \times 2^{E_{T,S-T}}\)。然后开始推式子。

推式子

\[\begin{aligned} g_T = \sum_{T\subseteq R} f_T \end{aligned} \]

子集反演,得到

\[\begin{aligned} f_T = \sum_{T\subseteq R} (-1)^{|R|-|T|} g_R \end{aligned} \]

则:

\[\begin{aligned} dp_S &= \sum_{T \subseteq S,T \ne \emptyset} f_T \\ &= \sum_{T \subseteq S,T \ne \emptyset} \sum_{T \subseteq R} (-1)^{|R|-|T|}g_R\\ &= \sum_{T \subseteq S,T \ne \emptyset} \sum_{T \subseteq R} (-1)^{|R|}g_R(-1)^{|T|}\\ &= \sum_{R \subseteq S,R \ne \emptyset} (-1)^{|R|}g_R \sum_{T \subseteq R,T \ne \emptyset} (-1)^{|T|} \end{aligned} \]

这里先扩展下二项式定理的内容:

\[\begin{aligned} (a+b)^n = \sum_{k=0}^n a^kb^{n-k} \end{aligned} \]

\(a=1,b=-1\),则:

\[\begin{aligned} 0^n = \sum_{k=0}^n (-1)^{k} \end{aligned} \]

因此,有:

\[\begin{aligned} dp_S &= \sum_{R \subseteq S,R \ne \emptyset} (-1)^{|R|}g_R ([R == \emptyset]-1)\\ &= \sum_{R \subseteq S,R \ne \emptyset} (-1)^{|R|+1}g_R\\ &= \sum_{R \subseteq S,R \ne \emptyset} (-1)^{|R|+1}dp_{S-R} \times 2^{E_{R,S-R}} \end{aligned} \]

然后我们可以高兴的发现,这个式子没有什么用。但是我们可以得到一个重要的东西,组合系数

DP(其二)

重新DP,这次直接定义 \(dp_S\) 为答案了。回忆一下,如果不可行,就是要让缩点后的SCC形成DAG。那么可以定义 \(g_T\) 表示 \(T\) 内的点所在的SCC为入度为 0 的SCC。那么继续考虑拨开DAG,则:

\[\begin{aligned} dp_S = 2^{E_{S,S}} - \sum_{T \subseteq S} (-1)^?g_T \times 2^{E_{T,S-T}+E_{S-T,S-T}} \end{aligned} \]

然后发现容斥系数非常难定,回忆一下上面的容斥系数,奇数个点(入度为 0 的)为减,偶数个为加。那么这次作用在SCC上,也就变成了SCC的个数。

因此,让 \(g_T\) 拥有符号,表示奇数个SCC的方案数-偶数个SCC的方案数。那么dp式子就变成了:

\[\begin{aligned} dp_S = 2^{E_{S,S}} - \sum_{T \subseteq S} g_T \times 2^{E_{T,S-T}+E_{S-T,S-T}} \end{aligned} \]

g的推导

因为胡乱钦定SCC非常混乱,不妨让\(g_S\)中的 \(lowbit(S)\) 成为新加入的SCC中的一员。则有:

\[\begin{aligned} g_S = dp_S - \sum_{T \subset S} dp_T \times g_{S-T} \end{aligned} \]

这里通过 - 这个操作,使得奇偶性完成了变化。

也许会发现当 \(S=T\) 时,难以处理,但要考虑到 \(dp_S\) 作为合法的方案,不应该被减去,所以可以让 \(g_S\) 先不加上 \(dp_S\),最后再加上,显然是正确的。

e的推导

这里就参照题解了。自己推下,可以发现是对的。

\[E_{T,S-T}=E_{T+x,S-T-x}+\operatorname{popcount}(in_x\operatorname{and}T)-\operatorname{popcount}(out_x\operatorname{and}(S-T)) \]

\[E_{S,S}=E_{S-x,S-x}+\operatorname{popcount}(in_x\operatorname{and}S)+\operatorname{popcount}(out_x\operatorname{and}S) \]

Code

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
const LL mod = 1e9 + 7;
const int M = 16,N = 1 << M | 5;
int n,m;
int mycount(int x){ return __builtin_popcount(x);}
int lowbit(int x){ return x & -x;}
int in[M],out[M];
LL dp[N],g[N];
LL pw[M * M];
int e1[N],e2[N];//E(T,S-T),E(S,S)
int id[N];
int main()
{IOS;cin >> n >> m;for(int i=0;i<n;i++)id[1<<i] = i;for(int i=1;i<=m;i++){int u,v;cin >> u >> v;u -- ,v -- ;out[u] |= (1 << v);in[v] |= (1 << u);}pw[0] = 1;for(int i=1;i<=m;i++)pw[i] = (pw[i-1] * 2ll ) % mod;for(int S=1;S<(1<<n);S++){int x = lowbit(S);e2[S] = e2[S - x] + mycount(in[id[x]] & (S - x)) + mycount(out[id[x]] & (S - x));}for(int S = 1;S < (1 << n);S ++ ){e1[S] = 0;for(int T = (S - 1) & S;T;T = (T - 1) & S){int x = lowbit(S - T);e1[T] = e1[T + x] - mycount(out[id[x]] & (S - T)) + mycount(in[id[x]] & T);}for(int T = (S - 1) & S;T;T = (T-1) & S){if(lowbit(T) != lowbit(S)) continue;g[S] -= (dp[T] * g[S - T]) % mod;g[S] += mod;g[S] %= mod;g[S] %= mod;}dp[S] = pw[e2[S]];for(int T = S;T;T = (T - 1) & S){dp[S] -= (g[T] * pw[e1[T] + e2[S-T]]) % mod;dp[S] += mod;dp[S] %= mod;}g[S] += dp[S];g[S] %= mod;}cout << dp[(1<<n)-1];return 0;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询