题面传送门

一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到?

首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部,这样我们肯定只能在左右部点之间连边,这大概算得上一个小套路吧,不过这还是萌新第一次见到这个套路呢,大佬不喜勿喷(

接下来考虑怎么求方案数,显然 \(1\) 只能放在左部点,我们还需从另外 \(n-1\) 个点中选出 \(k-1\) 个扔给左部,方案数为 \(\dbinom{n-1}{k-1}\),我们不妨就假设这 \(k-1\) 个点为 \([2,k]\cap\mathbb{Z}\),于是现在问题转化为:有一张二分图,左部有 \(k\) 个点,右部有 \(n-k\) 个点,要在它们之间连 \(n-1\) 条边使其构成一棵生成树。

看到这个问法我们很自然地想到矩阵树定理,不过此题 \(n\) 数据范围很大,矩阵树定理显然会炸,网上某篇题解给出了一个 prufer 序列的做法,然鹅我没看懂。注意到这张图很特殊,因此考虑手推行列式。首先很明显这张图的基尔霍夫矩阵如下:

\[\begin{bmatrix}
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\) 列。

去掉第一行第一列后的矩阵长这样:

\[\begin{bmatrix}
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\) 行上去可以得到:

\[\begin{bmatrix}
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\) 行上去,依次类推,最终可以得到:

\[\begin{bmatrix}
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\) 行上去可得

\[\begin{bmatrix}
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}\),那么该矩阵可写作

\[\begin{bmatrix}
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\) 行上:

\[\begin{bmatrix}
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\) 行上:

\[\begin{bmatrix}
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\) 行上去。

\[\begin{bmatrix}
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」共(矩阵树定理+手推行列式)的更多相关文章

  1. [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]

    题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...

  2. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  3. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  4. LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)

    题面 传送门 题解 转化为\(dfs\)序之后就变成一个区间加,区间查询\(k\)小值的问题了,这显然只能分块了 然而我们分块之后需要在块内排序,然后二分\(k\)小值并在块内二分小于它的元素--一个 ...

  5. LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)

    题面 传送门 题解 首先先把所有权值取个相反数来求最大收益,因为最小收益很奇怪 然后建图如下:\(S\to\)药,容量\(\inf+p_i\),药\(\to\)药材,容量\(\inf\),药材\(\t ...

  6. 【思维题 最大权闭合子图】loj#6045. 「雅礼集训 2017 Day8」价

    又是经典模型的好题目 题目描述 人类智慧之神 zhangzj 最近有点胖,所以要减肥,他买了 NN 种减肥药,发现每种减肥药使用了若干种药材,总共正好有 NN 种不同的药材. 经过他的人脑实验,他发现 ...

  7. loj#6029. 「雅礼集训 2017 Day1」市场(线段树)

    题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...

  8. loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移

    $ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...

  9. LOJ #6029. 「雅礼集训 2017 Day1」市场 线段树维护区间除法

    题目描述 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 \(n\) 个商贩,从\(0 \sim n - 1\) 编号,每个商 ...

随机推荐

  1. wget命令8种实用用法

    大家好,我是良许. wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上. 这实际上也是大家所使用的浏览器所做的 ...

  2. pycharm 服务器连接及一些问题解决

    主要介绍一下如何使用pycharm连接服务器并在服务器上炼丹,并对遇到的一个小问题进行说明. 目录 1,SSH连接 2,linux常用命令 3,配置anaconda 4,运行代码 5,一个常见错误 1 ...

  3. oo第四单元及期末总结

    一.第四单元作业架构总结 第一次UML作业: 在分析各指令所需要的信息后建立了类(class),操作(operation),属性(Attribute)这几个类用来存储分析后的结果,而接口在本次作业中与 ...

  4. Noip模拟30 2021.8.4

    T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...

  5. Celery Task(定时任务)及参数

    celery beat 是一个调度器:它以常规的时间间隔开启任务,任务将会在集群中的可用节点上运行. 默认情况下,入口项是从 beat_schedule 设置中获取,但是自定义的存储也可以使用,例如在 ...

  6. Beam Search快速理解及代码解析

    目录 Beam Search快速理解及代码解析(上) Beam Search 贪心搜索 Beam Search Beam Search代码解析 准备初始输入 序列扩展 准备输出 总结 Beam Sea ...

  7. AppScan 10安装使用

    一.简介 AppScan是IBM的一款web安全扫描工具,具有利用爬虫技术进行网站安全渗透测试的能力,能够根据网站入口自动摸取网页链接进行安全扫描,提供了扫描.报告和修复建议等功能. appscan有 ...

  8. 使用silky脚手架构建微服务应用

    目录 模板简介 构建独立应用的模板Silky.App.Template 构建模块化应用的模板Silky.Module.Template 开源地址 在线文档 模板简介 使用 dotnet new 命令可 ...

  9. idea Mark Directory as 的几种文件类型

    1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...

  10. 好久没更新了,我回来了---Ajax

    1.Ajax概念以及优势 * 什么是AJAX * AJAX(Asynchronous JavaScript And XML),(异步 JavaScript 和 XML),中文名:阿贾克斯.是指一种创建 ...