当前位置: 首页 > news >正文

P11714 [清华集训 2014] 主旋律 Sol

计数神题。

题目链接

前言

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

做本题之前,可以先看看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;
}
http://www.jsqmd.com/news/254814/

相关文章:

  • 夏天还不算开始——我,不会退役
  • GD5F1GM7UEYIGR:兆易创新1Gbit SPI NAND闪存,高效低功耗
  • 4B超越8B比肩30B!清华、面壁智能端侧智能体天花板开源
  • 企业软件供应链安全治理立项,方案书/立项书该怎么写?
  • [Non] 字符串问题
  • 谷歌Veo 3.1更新:更一致性、更具创造力和控制力
  • 评正高写书10万字什么价格?
  • Day15对象的方法与遍历对象
  • SCI分区是怎么划分的?
  • 深圳ACFlow智能营销系统:2026年中小企业AI驱动营销新范式
  • ACP:2.从一个 .NET 实战开始,看 Agent 带来的真实差异
  • 工业级文本转SQL新思路:成本暴降、超3000列超大数据库依然稳健
  • C++跨平台开发挑战的技术
  • 万卡的部署架构
  • IDM插件开发创意赛
  • Claude Code 在 Windows 下的 nul 文件问题解决方案
  • 建模智能体,AI 时代的数据治理新范式
  • DCDN和CDN科普:动态内容加速的秘密武器
  • 苹果手机照片怎么导入电脑?苹果手机传输照片就用这5招
  • 7843784538745
  • 探索AI原生应用领域,AI代理引领新潮流
  • LLM伦理推理让临床决策更公平
  • 从ChatBI到Agentic BI:衡石如何构建“自主决策与执行”的数据智能体
  • 基于深度学习的肺炎检测系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)
  • 2025年华南理工大学计算机考研复试机试真题(解题思路 + AC 代码)
  • 2025年济南大学计算机考研复试机试真题(解题思路 + AC 代码)
  • AI aigc
  • 【1 月小记】Part 4: 数位 DP - L
  • 2025年湖南大学计算机考研复试机试真题(解题思路 + AC 代码)
  • 2026最新31888标准面料推荐!国内优质面料品牌权威榜单发布,资质与品质双优助力纺织行业高质量发展 - 品牌推荐2026