zoukankan      html  css  js  c++  java
  • LOJ#6044. 「雅礼集训 2017 Day8」共

    题面

    题解

    显然树是二分图。所以问题很容易地变成了:限制和 (1) 一边的点数为 (K) 的二分图生成树个数。(但是我并没有想出来这一步

    首先求出限制和 (1) 一边的点数为 (K) 的二分图个数,为 (largeinom {N - 1} {K - 1})

    那么只需求出像那个样子的生成树个数即可。

    矩阵树定理

    写出该图的基尔霍夫矩阵消去最后一行一列的行列式:

    [left|egin{matrix} 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 & vdots & vdots & vdots & vdots & ddots & vdots \ -1 & -1 & cdots & -1 & 0 & 0 & cdots & K end{matrix} ight| ]

    其中有 (K)(N - K)(N - K - 1)(K)

    首先消下面一半,用第 (i) 行减第 (i + 1) 行,得

    [left|egin{matrix} N - K & 0 & cdots & 0 & -1 & -1 & -1 & cdots & -1\ 0 & N - K & cdots & 0 & -1 & -1 & -1 & cdots & -1\ vdots & vdots & ddots & vdots & vdots & vdots & vdots & vdots & vdots \ 0 & 0 & cdots & N - K & -1 & -1 & -1 & cdots & -1\ 0 & 0 & cdots & 0 & K & -K & 0 & cdots & 0\ 0 & 0 & cdots & 0 & 0 & K & -K & cdots & 0\ vdots & vdots & vdots & vdots & vdots & vdots & vdots & ddots & vdots \ -1 & -1 & cdots & -1 & 0 & 0 & 0 & cdots & K end{matrix} ight| ]

    将最后一行乘以 (N - K),得:

    [frac 1{N - K}left|egin{matrix} N - K & 0 & cdots & 0 & -1 & -1 & -1 & cdots & -1\ 0 & N - K & cdots & 0 & -1 & -1 & -1 & cdots & -1\ vdots & vdots & ddots & vdots & vdots & vdots & vdots & vdots & vdots \ 0 & 0 & cdots & N - K & -1 & -1 & -1 & cdots & -1\ 0 & 0 & cdots & 0 & K & -K & 0 & cdots & 0\ 0 & 0 & cdots & 0 & 0 & K & -K & cdots & 0\ vdots & vdots & vdots & vdots & vdots & vdots & vdots & ddots & vdots \ K - N & K - N & cdots & K - N & 0 & 0 & 0 & cdots & K(N - K) end{matrix} ight| ]

    将第 (1, 2, cdots k) 行加到最后一行,于是最后一行变为:

    [egin{bmatrix} 0 & 0 & cdots & 0 & -K & -K & cdots & -K & K(N - K - 1) end{bmatrix} ]

    然后将第 (k + 1) 行加到最后一行,得到

    [egin{bmatrix} 0 & 0 & cdots & 0 & 0 & -2K & -K & cdots & K(N - K - 1) end{bmatrix} ]

    同理将第 (k + i)( imes i) 加到最后一行,可得

    [egin{bmatrix} 0 & 0 & cdots & (K(N - K - 1) - K(N - K - 2)) end{bmatrix} ]

    即所求变为

    [frac 1{N - K}left|egin{matrix} N - K & 0 & cdots & 0 & -1 & -1 & -1 & cdots & -1\ 0 & N - K & cdots & 0 & -1 & -1 & -1 & cdots & -1\ vdots & vdots & ddots & vdots & vdots & vdots & vdots & vdots & vdots \ 0 & 0 & cdots & N - K & -1 & -1 & -1 & cdots & -1\ 0 & 0 & cdots & 0 & K & -K & 0 & cdots & 0\ 0 & 0 & cdots & 0 & 0 & K & -K & cdots & 0\ vdots & vdots & vdots & vdots & vdots & vdots & vdots & ddots & vdots \ 0 & 0 & cdots & 0 & 0 & 0 & 0 & cdots & K end{matrix} ight| ]

    那么就是

    [frac 1{N - K} (N - K)^K K^{N - K - 1} = (N - K)^{K - 1}K^{N - K - 1} ]

    所以答案就是

    [inom{N - 1}{K - 1} (N - K)^{K - 1}K^{N - K - 1} ]

    直接计算即可。

    Prufer 序列

    看这里

    等一发神仙 hyj 的 blog(

    代码

    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
    
    inline int read()
    {
    	int data = 0, w = 1; char ch = getchar();
    	while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
    	if (ch == '-') w = -1, ch = getchar();
    	while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
    	return data * w;
    }
    
    const int N(5e5 + 10);
    int n, K, Mod, fac[N], inv[N];
    int C(int n, int m) { return 1ll * fac[n] * inv[m] % Mod * inv[n - m] % Mod; }
    int fastpow(int x, int y)
    {
    	int ans = 1;
    	for (; y; y >>= 1, x = 1ll * x * x % Mod)
    		if (y & 1) ans = 1ll * ans * x % Mod;
    	return ans;
    }
    
    int main()
    {
    	n = read(), K = read(), Mod = read(), fac[0] = inv[0] = 1;
    	for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
    	inv[n] = fastpow(fac[n], Mod - 2);
    	for (int i = n - 1; i; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % Mod;
    	printf("%lld
    ", 1ll * C(n - 1, K - 1) * fastpow(K, n - K - 1) % Mod * fastpow(n - K, K - 1) % Mod);
    	return 0;
    }
    
  • 相关阅读:
    TypeError: expected string or bytes-like object
    Python之DataFrame更改列名及重排列顺序
    重启nginx 分类: ubuntu 测试 虚拟机 2014-12-12 11:50 126人阅读 评论(0) 收藏
    virtualbox下ubuntu调整分辨率的方法(给力!!!) 分类: ubuntu 虚拟机 2014-12-04 14:01 223人阅读 评论(0) 收藏
    安装Chrome driver/ IE driver 分类: python基础学习 2014-08-15 11:38 1328人阅读 评论(0) 收藏
    Python的静态方法和类成员方法 分类: python基础学习 2014-08-13 14:21 205人阅读 评论(0) 收藏
    linux 修改系统时间 分类: ubuntu 2014-07-28 12:04 209人阅读 评论(0) 收藏
    详解python linecache模块读取文件的方法 分类: python Module 2014-07-21 18:32 1057人阅读 评论(0) 收藏
    解决 WindowsError: [Error 87] 分类: 问题总结 2014-04-09 22:21 1266人阅读 评论(0) 收藏
    静态方法 分类: python基础学习 2014-04-05 19:34 228人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/cj-xxz/p/13055327.html
Copyright © 2011-2022 走看看