ARC173F

题意

给定 \(n,A,B\),初始有一个集合 \(S=\{1,2,\dots,A,A
+1,A+2,\dots,A+B\}\)。进行如下操作 \(n-1\) 次使得剩下 \(n\) 个集合:

  • 从所有集合中选择一个,记为 \(S_0\)。
  • 从 \(S_0\) 中选择一个元素 \(a\) 满足 \(a\in[1,A]\),选择一个元素 \(b\) 满足 \(b\in[A+1,A+B]\)。
  • 将 \(S_0\) 分裂成两个集合 \(S_1,S_2\),其中 \(a\in S_1,b\in S_2\)。
  • 把 \(S_0\) 删掉,把 \(S_1,S_2\) 加入待选集合。

问有多少种本质不同操作方案,对 \(998244353\) 取模。

其中定义两种方案不同,当且仅当存在一步中 \((S_0,a,b,S_1,S_2)\) 中任意一个元素不同。

\(2\le n\le 2\times 10^5,1\le A,B\le 2\times 10^5,n\le A+B\)

Solution

倒序操作。

设最后得到的集合序列(即有标号)是 \(S_{1:n}\),\(S_i\cap [1,A]=a_i,b_i=|S_i|-a_i\)。

假设得到了这个序列怎么统计分裂方案数?把分裂看成连边,合并 \((u,v)\) 的贡献就是 \(a_ub_v+a_vb_u\)(一个左边一个右边),再求生成树的积和。容易验证,这样的计算是正确的。为了简化计算,我们认为可以节点自己连边。

使用矩阵树定理。设 \(a=(a_2,a_3,\dots a_n)^T\),\(b=(b_2,b_3,\dots b_n)^T\)。\(\det (L)=\det(\operatorname{diag}(Ab+Ba)-ab^T-ba^T)=\det(D-ab^T-ba^T)\)。

为了简化计算而非进行神秘的枚举容斥什么的,我们考虑分块矩阵的”降阶公式“:

\[\det \left |\begin{matrix}A & B\\C& D\end{matrix}\right|=|A||D-CA^{-1}B|
\]

构造 \(B=0a\),那么:

\[\det(D-ab^T-ba^T)=\det \left|\begin{matrix}D-ab^T-ba^T & B & B\\a^T & 1& 0\\
b^T &0&1\end{matrix}\right|
\]

而对其施加初等变换:

\[\det \left|\begin{matrix}D-ab^T-ba^T & B & B\\a^T & 1& 0\\
b^T &0&1\end{matrix}\right|=\det \left|\begin{matrix}D & b & a \\a^T & 1& 0\\
b^T &0&1\end{matrix}\right|=\det \left|\begin{matrix}D & b & a \\0 & 1-a^TD^{-1}b& -a^TD^{-1}a\\
0 & -b^TD^{-1}b& 1-b^TD^{-1}a\end{matrix}\right|\\
\]

\[F=\left|\begin{matrix}1-a^TD^{-1}b& -a^TD^{-1}a\\
-b^TD^{-1}b& 1-b^TD^{-1}a\end{matrix}\right|\\
\]

那么:

\[\det(D-ab^T-ba^T)=|D||F-0|=|D||F|
\]

而 \(D\) 的行列式容易计算。接下来只需计算这个二阶行列式。

\[|F|=(1-a^TD^{-1}b)(1-b^TD^{-1}a)-(a^TD^{-1}a)(b^TD^{-1}b)
\]

而 \(D^{-1}=\operatorname{diag}(Ab+Ba)\) 的每项取倒数。

那么可以计算得到:

\[|F|=1-2\sum_{i=2}^n \frac{a_ib_i}{a_iB+b_iA}+\sum_{i=2}^n\sum_{j=2}^n \frac{a_ia_jb_ib_j}{(a_iB+b_iA)(a_jB+b_jA)}-\sum_{i=2}^n\sum_{j=2}^n \frac{a_i^2b_j^2}{(a_iB+b_iA)(a_jB+b_jA)}\\
|D|=\prod_{i= 2}^n (Ab_i+Ba_i)
\]

那么我们可以有快速求出答案的希望了。考虑一组 \(a,b\) 序列对答案的贡献:最后得到了不应该是序列,而是集合的集合;用多项式系数算即可。还需要矩阵树的系数:贡献就是:

\[\frac{A!B!}{n}\prod _{i=1}^n \frac 1{a_i!b_i!}
\]

得到答案的式子(略显抽象):

\[\frac{A!B!}{n}\sum_{\sum a_i=A,\sum b_i=B}\left(\prod_{i=1}^n \frac{1}{a_i!b_i!}\right)\left(\prod_{i= 2}^n (Ab_i+Ba_i)\right)\left(1-2\sum_{i=2}^n \frac{a_ib_i}{a_iB+b_iA}+\sum_{i=2}^n\sum_{j=2}^n \frac{a_ia_jb_ib_j}{(a_iB+b_iA)(a_jB+b_jA)}-\sum_{i=2}^n\sum_{j=2}^n \frac{a_i^2b_j^2}{(a_iB+b_iA)(a_jB+b_jA)}\right)
\]

这个式子固然抽象,但是可以把求和每个拆开。在此之前,先证明引理:

\[P(x,y)=\sum_{i,j} a_{i,j}x^iy^j,Q(x,y)=\sum _{i,j}a_{i,j}x^{\underline i}y^{\underline{j}}
\]

则:

\[\sum_{a,b\ge 0}\frac{P(a,b)x^ay^b}{a!b!}=Q(x,y)e^{x+y}
\]

可以从模板下降幂多项式乘法那里得到。

由于篇幅原因,这里不给出全部推导,我们演示

\[\sum_{\sum a_i=A,\sum b_i=B}\left(\prod_{i=1}^n \frac{1}{a_i!b_i!}\right)\left(\prod_{i= 2}^n (Ab_i+Ba_i)\right)\left(-2\sum_{i=2}^n \frac{a_ib_i}{a_iB+b_iA}\right)\\
=-2\sum_{k=2}^n\sum_{\sum a_i=A,\sum b_i=B}\left(\frac{a_kb_k}{a_kB+b_kA}\right)\left(\prod_{i=1}^n \frac{1}{a_i!b_i!}\right)\left(\prod_{i= 2}^n (Ab_i+Ba_i)\right)
\]

发现 \(k\) 的具体取值是无关紧要的。那么化为:

\[=-2(n-1)\sum_{a_1\le A,b_1\le B}\frac{a_1b_1}{a_1!b_1!}\sum_{a_2\le A-a_1,b_2\le B-b_1}\frac{1}{a_2!b_2!}\sum_{\sum_{i>2} a_i=A-a_1-a_2,\sum_{i>2} b_i=B-b_1-b_2}\left(\prod_{i=3}^n \frac{1}{a_i!b_i!}\right)\left(\prod_{i=3}^n (Ab_i+Ba_i)\right)\\
\]

设 \(P_1(x,y)=xy,P_2(x,y)=1,P_3(x,y)=Bx+Ay\),则 \(Q_1(x,y)=xy,Q_2(x,y)=1,Q_3(x,y)=Bx+Ay\)(一次的时候是没有变化的),那么这一部分答案就是:

\[-2(n-1)xye^{x+y}\times e^{x+y}\times (Bx+Ay)^{n-2}e^{(n-2)xy}=-2(n-1)xy(Bx+Ay)e^{n(x+y)}
\]

其实可以把一些东西简化一下,这里就不展示了。

那么最后的答案就是

\[\frac{A!B!}{n}[x^Ay^B]e^{n(x+y)}\left((Bx+Ay)^{n-1}-2(n-1)xy(Bx+Ay)^{n-2}-(n-1)(n-2)(x^2y+xy^2+xy)(Bx+Ay)^{n-3}\right)
\]
// Problem: [ARC173F] Select and Split
// Platform: Luogu
// URL: https://www.luogu.com.cn/problem/AT_arc173_f
// Memory Limit: 1 MB
// Time Limit: 2000 ms
// Author:British Union
// Long live UOB and koala
//
// Powered by CP Editor (https://cpeditor.org) #include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353,maxn=4e5+5;
int fac[maxn],ifac[maxn],N=4e5,n,A,B;
int qp(int a,int b){
if(b==0)return 1;
int T=qp(a,b>>1);T=T*T%mod;
if(b&1)T=T*a%mod;
return T;
}
int C(int a,int b){
if(b>a)return 0;
// cout<<"C("<<a<<","<<b<<")="<<(fac[a]*ifac[b]%mod*ifac[a-b]%mod)<<endl;
return fac[a]*ifac[b]%mod*ifac[a-b]%mod;
}
int gete(int a,int b){
if(a<0||b<0)return 0;
return qp(n,a+b)*C(a+b,a)%mod*ifac[a+b]%mod;
}
int calc(int t,int a,int b){
if(t<0||a<0||b<0)return 0;
int res=0;
for(int i=0;i<=t;i++){
(res+=C(t,i)*gete(a-i,b-(t-i))%mod*qp(B,i)%mod*qp(A,t-i))%=mod;
}
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>A>>B;
fac[0]=1;
for(int i=1;i<=N;i++)fac[i]=fac[i-1]*i%mod;
ifac[N]=qp(fac[N],mod-2);
for(int i=N-1;i>=0;i--)ifac[i]=ifac[i+1]*(i+1)%mod;
int res=calc(n-1,A,B)-2*(n-1)%mod*calc(n-2,A-1,B-1)%mod-(n-1)*(n-2)%mod*(calc(n-3,A-2,B-1)+calc(n-3,A-1,B-2)+calc(n-3,A-1,B-1))%mod;
res=fac[A]*fac[B]%mod*qp(n,mod-2)%mod*res%mod;
res=(res%mod+mod)%mod;
cout<<res<<endl;
return 0;
}

降阶公式/ARC173F的更多相关文章

  1. [问题2014A02] 解答三(降阶公式法)

    [问题2014A02] 解答三(降阶公式法) 将矩阵 \(A\) 写成如下形式: \[A=\begin{pmatrix} -2a_1 & 0 & \cdots & 0 & ...

  2. 复旦高等代数 I(15级)思考题

    1.证明: 第三类分块初等变换是若干个第三类初等变换的复合. 特别地, 第三类分块初等变换不改变行列式的值. 2.设 $n\,(n\geq 2)$ 阶方阵 $A=(a_{ij}(x))$, 其中每个元 ...

  3. [问题2014A02] 复旦高等代数 I(14级)每周一题(第四教学周)

    [问题2014A02]  求下列 \(n\) 阶行列式的值, 其中 \(a_i\neq 0\,(i=1,2,\cdots,n)\): \[ |A|=\begin{vmatrix} 0 & a_ ...

  4. [问题2014A04] 解答

    [问题2014A04]  解答 (1) 由条件可得 \(AB+BA=0\), 即 \(AB=-BA\), 因此 \[AB=A^2B=A(AB)=A(-BA)=-(AB)A=-(-BA)A=BA^2=B ...

  5. [问题2014S05] 解答

    [问题2014S05] 解答  (本解答由谷嵘同学提供) 首先, 由 \(\mathrm{tr}(AB)=\mathrm{tr}(BA)\) 可得 \(a=0\), 或者由 Cauchy-Binet ...

  6. 复旦大学2016--2017学年第一学期高等代数I期末考试情况分析

    一.期末考试成绩班级前十名 宁盛臻(100).朱民哲(92).徐钰伦(86).范凌虎(85).沈伊南(84).何陶然(84).丁知愚(83).焦思邈(83).董瀚泽(82).钱信(81) 二.总成绩计 ...

  7. 复旦大学2016--2017学年第二学期高等代数II期末考试情况分析

    一.期末考试成绩班级前十五名 林晨(93).朱民哲(92).何陶然(91).徐钰伦(91).吴嘉诚(91).于鸿宝(91).宁盛臻(90).杨锦文(89).占文韬(88).章俊鑫(87).颜匡萱(87 ...

  8. 复旦高等代数I(19级)每周一题

    本学期的高等代数每周一题活动计划从第2教学周开始,到第15教学周结束,每周的周末公布一道思考题(共14道,思考题一般与下周授课内容密切相关),供大家思考和解答.每周一题将通过“高等代数官方博客”(以博 ...

  9. 复旦高等代数 I(15级)每周一题

    [问题2015A01]  证明: 第三类分块初等变换是若干个第三类初等变换的复合. 特别地, 第三类分块初等变换不改变行列式的值. [问题2015A02]  设 $n\,(n\geq 2)$ 阶方阵 ...

  10. 为WLW开发Latex公式插件

    WLW是写博客的利器,支持离线.格式排版等,而且拥有众多的插件.博客园推荐了代码插入插件,但是没有提供WLW的公式编译插件.目前我的一般做法是:先在Word下使用MathType编辑好公式,然后将公式 ...

随机推荐

  1. KnowledgeManagement

    知识管理建议 总则 总参 从无知到有知 资料收集的习惯 发表是最好的记忆 Wiki 使用 建议: Blog 写作 Discuss 搜索技巧 回复:Yibie的知识管理流程与工具选择 一.个人知识管理的 ...

  2. MySQL底层概述—7.优化原则及慢查询

    大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模 ...

  3. web移动端常见问题(二)

    1.input光标颜色 默认情况下,光标颜色与字体颜色color相同,但也可以通过caret-color属性来单独设置 但是IOS的光标与字体颜色无关,默认是蓝色 可以单独设置光标颜色,这样ios也有 ...

  4. 鸿蒙NEXT开发案例:九宫格随机

    [引言] 在鸿蒙NEXT开发中,九宫格抽奖是一个常见且有趣的应用场景.通过九宫格抽奖,用户可以随机获得不同奖品,增加互动性和趣味性.本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能,并通过代码解析展示 ...

  5. .NET Aspire Apps 集成测试

    原文:https://fiodar.substack.com/p/integration-testing-dotnet-aspire-apps 对于软件开发来说,拥有自动化的覆盖测试非常重要.尽管手工 ...

  6. [sa-token]StpUtil.getLoginId

    闲聊 一般情况下,我们想用uid,可能需要前端将uid传过来,或者将token传来,然后我们进行识别. 用了sa-token之后,可以使用StpUtil.getLoginId()方法获取当前会话的用户 ...

  7. 【转载】Netty堆外内存泄漏排查

    https://www.imooc.com/article/298943 上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章 ...

  8. Qt开发经验小技巧276-280

    对MDI窗体区域设置背景颜色透明,会发现 QMdiArea{background:transparent;} 无效,哪怕是指定颜色 QMdiArea{background:#ff0000;} 或者 Q ...

  9. Qt编写安防视频监控系统25-离线地图

    一.前言 离线地图这个功能是近期才完成的,老早以前就很多人问有没有离线地图的功能,之前也大致了解过如何做离线地图,其实最核心的不是代码,而是如何搞到免费的离线地图文件,离线地图下载器网上大部分都是收费 ...

  10. Qt音视频开发25-ffmpeg音量设置

    一.前言 音视频的播放.关闭.暂停.继续这几个基本功能,绝大部分人都是信手拈来的搞定,关于音量调节还是稍微饶了下弯弯,最开始打算采用各个系统的api来处理,坐下来发现不大好,系统的支持不完美,比如有些 ...