题面传送门

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

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

接下来考虑怎么求方案数,显然 \(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. springcloud(二) 微服务架构编码构建

    微服务架构编码构建 1 基础知识 1.1 版本 2 微服务cloud整体聚合父工程Project 2.1 new project 2.2 字符编码设置 utf-8 2.3 pom.xml 2.4 父工 ...

  2. Beta阶段性总结

    1.题士开发总结 2.反思 2.1 Issue管理 从0522敲定各个功能的API后,团队成员及时沟通,积极开发,但由于开发过程没能有效体现在issue上(如未能及时在issue上形成记录,功能开发完 ...

  3. makedown笔记

    makedown语法 表格 这个表格的主题 |姓名|性别|年龄|职业| | ----- | ----- | ----- | ----- | |张三|男|34|码农| |李四|男|27|代驾| 这个表格 ...

  4. JavaAgent型内存马基础

    Java Instrumentation ​ java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不 ...

  5. IRCUT作用

    IRCUT组成原理 IRCUT由两层滤光片组成,一片红外截止或吸收滤光片和一片全透光谱滤光片 白天是红外截止滤光片工作,晚上是全透滤光片工作,白天摄像头可以接收到人眼无法识别的红外线,会导致图像与肉眼 ...

  6. 万能构造解决Rolle中值问题

    只要原函数是两个函数的乘积形式,皆可此构造.

  7. poj 1330 Nearest Common Ancestors (最简单的LCA)

    题意: 给出一棵树的结构. 给出两个点X和Y,求它俩的LCA. 思路: 只需求两个点的LCA,用了两种方法,一种离线tarjan,一种直接搞. 看代码. 代码: 方法一:直接搞. int const ...

  8. ELK集群之logstash(5)

    Logstash工作原理   Logstash事件处理有三个阶段:inputs → filters → outputs.是一个接收,处理,转发日志的工具.支持系统日志,webserver日志,错误日志 ...

  9. SpringBoot之MultipartFile文件上传(6)

    1.静态文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  10. 在随着layui官网下架后 layui镜像站起来了

    layui:https://gitee.com/lh_yun/layui 介绍 layui镜像站 「本站仅为 layui 文档保留的镜像站点,与官方无关」 源码地址 在线 pdf 1.主页 https ...