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\) 编号,每个商 ...
随机推荐
- 【Spring】IoC容器 - 依赖来源
前言 上一篇文章已经学习了[依赖注入]相关的知识,这里详细的介绍一下[依赖来源]. 依赖来源 我们把依赖来源分为依赖查找的来源和依赖注入的来源分别讨论. 依赖查找的来源 1. Spring BeanD ...
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- [Beta]the Agiles Scrum Meeting 6
会议时间:2020.5.20 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助成员解决配置环境问题 tq 增加功能:添加多个评测机 评测部分增加更多评测指标 ...
- time_formatter攻防世界学习
time_formatter 前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(), ...
- Noip模拟74 2021.10.11
T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...
- Noip模拟71 2021.10.7
T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...
- [CSP-S 2021] 回文
题目描述: 给定正整数 n 和整数序列 a1, a2,-,a2n,在这 2n 个数中,1, 2,-,n 分别各出现恰好 2 次.现在进行 2n 次操作,目标是创建一个长度同样为 2n 的序列 b 1, ...
- 最小最大堆min-max Heap
(1)由性质5只能插在奇数层,即根节点处,7下沉到右堆的min level,10下沉到max level,插入后满足min-max heap性质,很容易画出: (2)由性质80也是向右堆插入,且插入到 ...
- 转:进行vivado开发时,Generate Bitstream报错[DRC NSTD-1],详细解决步骤
报错如下 [Drc 23-20] Rule violation (NSTD-1) Unspecified I/O Standard - 4 out of 142 logical ports use I ...
- 跳台阶 牛客网 剑指Offer
跳台阶 牛客网 剑指Offer 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). class Solution: #ru ...