LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)
一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到?
首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部,这样我们肯定只能在左右部点之间连边,这大概算得上一个小套路吧,不过这还是萌新第一次见到这个套路呢,大佬不喜勿喷(
接下来考虑怎么求方案数,显然 \(1\) 只能放在左部点,我们还需从另外 \(n-1\) 个点中选出 \(k-1\) 个扔给左部,方案数为 \(\dbinom{n-1}{k-1}\),我们不妨就假设这 \(k-1\) 个点为 \([2,k]\cap\mathbb{Z}\),于是现在问题转化为:有一张二分图,左部有 \(k\) 个点,右部有 \(n-k\) 个点,要在它们之间连 \(n-1\) 条边使其构成一棵生成树。
看到这个问法我们很自然地想到矩阵树定理,不过此题 \(n\) 数据范围很大,矩阵树定理显然会炸,网上某篇题解给出了一个 prufer 序列的做法,然鹅我没看懂。注意到这张图很特殊,因此考虑手推行列式。首先很明显这张图的基尔霍夫矩阵如下:
n-k&0&0&\cdots&0&-1&-1&\cdots&-1\\
0&n-k&0&\cdots&0&-1&-1&\cdots&-1\\
0&0&n-k&\cdots&0&-1&-1&\cdots&-1\\
\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&0&\cdots&n-k&-1&-1&\cdots&-1\\
-1&-1&-1&\cdots&-1&k&0&\cdots&0\\
-1&-1&-1&\cdots&-1&0&k&\cdots&0\\
\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
-1&-1&-1&\cdots&-1&0&0&\cdots&k\\
\end{bmatrix}
\]
其中左边有 \(k\) 列,右边有 \(n-k\) 列。
去掉第一行第一列后的矩阵长这样:
n-k&0&\cdots&0&-1&-1&\cdots&-1\\
0&n-k&\cdots&0&-1&-1&\cdots&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&\cdots&-1\\
-1&-1&\cdots&-1&k&0&\cdots&0\\
-1&-1&\cdots&-1&0&k&\cdots&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
-1&-1&\cdots&-1&0&0&\cdots&k\\
\end{bmatrix}
\]
其中左边有 \(k-1\) 列,右边有 \(n-k\) 列。
接下来考虑求行列式,考虑使用倍加相消的方法,首先我们将第 \(k+1\) 行乘 \(-1\) 倍加到第 \(k\) 行上去可以得到:
n-k&0&\cdots&0&-1&-1&\cdots&-1\\
0&n-k&\cdots&0&-1&-1&\cdots&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&\cdots&-1\\
0&0&\cdots&0&k&-k&\cdots&0\\
-1&-1&\cdots&-1&0&k&\cdots&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots\\
-1&-1&\cdots&-1&0&0&\cdots&k\\
\end{bmatrix}
\]
再依次将 \(k+2\) 行乘 \(-1\) 倍加到第 \(k+1\) 行上去,第 \(k+3\) 行乘 \(-1\) 倍加到第 \(k+2\) 行上去,依次类推,最终可以得到:
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&k&-k&0&\cdots&0&0\\
0&0&\cdots&0&0&k&-k&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&k&-k\\
-1&-1&\cdots&-1&0&0&0&\cdots&0&k\\
\end{bmatrix}
\]
然后依次将第 \(1,2,\cdots,k-1\) 行乘 \(\dfrac{1}{n-k}\) 倍加到第 \(n\) 行上去可得
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&k&-k&0&\cdots&0&0\\
0&0&\cdots&0&0&k&-k&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&k&-k\\
0&0&\cdots&0&-\dfrac{k-1}{n-k}&-\dfrac{k-1}{n-k}&-\dfrac{k-1}{n-k}&\cdots&-\dfrac{k-1}{n-k}&k-\dfrac{k-1}{n-k}\\
\end{bmatrix}
\]
记 \(A=k,B=\dfrac{k-1}{n-k}\),那么该矩阵可写作
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&A&-A&0&\cdots&0&0\\
0&0&\cdots&0&0&A&-A&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&A&-A\\
0&0&\cdots&0&-B&-B&-B&\cdots&-B&A-B\\
\end{bmatrix}
\]
将第 \(k\) 行乘 \(\dfrac{B}{A}\) 倍加到第 \(n-1\) 行上:
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&A&-A&0&\cdots&0&0\\
0&0&\cdots&0&0&A&-A&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&A&-A\\
0&0&\cdots&0&0&-2B&-B&\cdots&-B&A-B\\
\end{bmatrix}
\]
将第 \(k+1\) 行乘 \(\dfrac{2B}{A}\) 倍加到第 \(n-1\) 行上:
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&A&-A&0&\cdots&0&0\\
0&0&\cdots&0&0&A&-A&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&A&-A\\
0&0&\cdots&0&0&0&-3B&\cdots&-B&A-B\\
\end{bmatrix}
\]
以此类推,依次执行“将第 \(k-1+i\) 行乘 \(\dfrac{iB}{A}\) 倍加到第 \(n-1\) 上,\(i\le n-k-1\)”。最后一步进行的应该是将 \(n-2\) 行乘 \(\dfrac{(n-k-1)B}{A}\) 到第 \(n-1\) 行上去。
n-k&0&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
0&n-k&\cdots&0&-1&-1&-1&\cdots&-1&-1\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&n-k&-1&-1&-1&\cdots&-1&-1\\
0&0&\cdots&0&A&-A&0&\cdots&0&0\\
0&0&\cdots&0&0&A&-A&\cdots&0&0\\
\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\
0&0&\cdots&0&0&0&0&\cdots&A&-A\\
0&0&\cdots&0&0&0&0&\cdots&0&A-(n-k)B\\
\end{bmatrix}
\]
我们惊奇地发现,\(A-(n-k)B=1\)。
因此该矩阵的行列式就是 \((n-k)^{k-1}\times A^{n-k-1}=(n-1)^{k-1}\times k^{n-k-1}\)
最终答案就是 \((n-k)^{k-1}\times k^{n-k-1}\times\dbinom{n-1}{k-1}\)
代码就不贴了,估计连刚学 OI 的都会写罢(
upd:还是贴了(因为这是我在 Linux VIM 下写出的并用共享文件夹传到 Windows 上的文件(((
#include <bits/stdc++.h>
using namespace std;
int n,k,mod;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%mod) if(e&1) ret=1ll*ret*x%mod;
return ret;
}
namespace Small{
const int MAXN=1000;
int c[MAXN+5][MAXN+5];
void solve(){
for(int i=0;i<=MAXN;i++){
c[i][0]=1;
for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
printf("%d\n",1ll*c[n-1][k-1]*qpow(k,n-k-1)%mod*qpow(n-k,k-1)%mod);
}
}
namespace Large{
const int MAXN=5e5;
int fac[MAXN+5],ifac[MAXN+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[mod%i]*(mod-mod/i)%mod;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*ifac[i]*ifac[i-1]%mod;
}
void solve(){
init_fac(MAXN);
printf("%d\n",1ll*fac[n-1]*ifac[n-k]%mod*ifac[k-1]%mod*qpow(k,n-k-1)%mod*qpow(n-k,k-1)%mod);
}
}
int main(){//edited in VIM
scanf("%d%d%d",&n,&k,&mod);
if(n<=1000) Small::solve();
else Large::solve();
return 0;
}
LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)的更多相关文章
- [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]
题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...
- LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)
题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...
- loj #6046. 「雅礼集训 2017 Day8」爷
#6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...
- LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)
题面 传送门 题解 转化为\(dfs\)序之后就变成一个区间加,区间查询\(k\)小值的问题了,这显然只能分块了 然而我们分块之后需要在块内排序,然后二分\(k\)小值并在块内二分小于它的元素--一个 ...
- LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)
题面 传送门 题解 首先先把所有权值取个相反数来求最大收益,因为最小收益很奇怪 然后建图如下:\(S\to\)药,容量\(\inf+p_i\),药\(\to\)药材,容量\(\inf\),药材\(\t ...
- 【思维题 最大权闭合子图】loj#6045. 「雅礼集训 2017 Day8」价
又是经典模型的好题目 题目描述 人类智慧之神 zhangzj 最近有点胖,所以要减肥,他买了 NN 种减肥药,发现每种减肥药使用了若干种药材,总共正好有 NN 种不同的药材. 经过他的人脑实验,他发现 ...
- loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...
- loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移
$ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...
- LOJ #6029. 「雅礼集训 2017 Day1」市场 线段树维护区间除法
题目描述 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 \(n\) 个商贩,从\(0 \sim n - 1\) 编号,每个商 ...
随机推荐
- wget命令8种实用用法
大家好,我是良许. wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上. 这实际上也是大家所使用的浏览器所做的 ...
- pycharm 服务器连接及一些问题解决
主要介绍一下如何使用pycharm连接服务器并在服务器上炼丹,并对遇到的一个小问题进行说明. 目录 1,SSH连接 2,linux常用命令 3,配置anaconda 4,运行代码 5,一个常见错误 1 ...
- oo第四单元及期末总结
一.第四单元作业架构总结 第一次UML作业: 在分析各指令所需要的信息后建立了类(class),操作(operation),属性(Attribute)这几个类用来存储分析后的结果,而接口在本次作业中与 ...
- Noip模拟30 2021.8.4
T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...
- Celery Task(定时任务)及参数
celery beat 是一个调度器:它以常规的时间间隔开启任务,任务将会在集群中的可用节点上运行. 默认情况下,入口项是从 beat_schedule 设置中获取,但是自定义的存储也可以使用,例如在 ...
- Beam Search快速理解及代码解析
目录 Beam Search快速理解及代码解析(上) Beam Search 贪心搜索 Beam Search Beam Search代码解析 准备初始输入 序列扩展 准备输出 总结 Beam Sea ...
- AppScan 10安装使用
一.简介 AppScan是IBM的一款web安全扫描工具,具有利用爬虫技术进行网站安全渗透测试的能力,能够根据网站入口自动摸取网页链接进行安全扫描,提供了扫描.报告和修复建议等功能. appscan有 ...
- 使用silky脚手架构建微服务应用
目录 模板简介 构建独立应用的模板Silky.App.Template 构建模块化应用的模板Silky.Module.Template 开源地址 在线文档 模板简介 使用 dotnet new 命令可 ...
- idea Mark Directory as 的几种文件类型
1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...
- 好久没更新了,我回来了---Ajax
1.Ajax概念以及优势 * 什么是AJAX * AJAX(Asynchronous JavaScript And XML),(异步 JavaScript 和 XML),中文名:阿贾克斯.是指一种创建 ...