\(\mathcal{Description}\)

  link.

  给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边。问 \(q\) 条边去重后构成生成树的方案总数,对 \(p\) 取模。

\(\mathcal{Solution}\)

  首先求出 \(n-1\) 条边构成生成树的方案数,显然矩阵树定理。

  接着,令 \(f(i,j)\) 表示操作 \(i\) 次,去重后有 \(j\) 条边的方案数。那么有:

\[f(i,j)=jf(i-1,j)+(m-j+1)f(i-1,j-1)
\]

  这个式子可以矩阵快速幂优化,最后把上面两个东西乘起来就是总方案啦。复杂度 \(\operatorname{O}(n^3\log q)\)。

\(\mathcal{Code}\)

  这个 HDU 它一直 SF 呢 qwq。理论 AC 代码如下 w。

#include <cstdio>
#include <cstring>
#include <assert.h>
#include <iostream> const int MAXN = 100;
int n, m, p, q, K[MAXN + 5][MAXN + 5]; inline void add ( const int u, const int v ) {
++ K[u][u], ++ K[v][v], -- K[u][v], -- K[v][u];
if ( K[u][v] < 0 ) K[u][v] += p;
if ( K[v][u] < 0 ) K[v][u] += p;
} inline int det ( const int n ) {
int ret = 1, swp = 1;
for ( int i = 1; i < n; ++ i ) {
for ( int j = i + 1; j < n; ++ j ) {
for ( ; K[j][i]; std::swap ( K[i], K[j] ), swp *= -1 ) {
int d = K[i][i] / K[j][i];
for ( int k = i; k < n; ++ k ) K[i][k] = ( K[i][k] - 1ll * d * K[j][k] % p + p ) % p;
}
}
if ( ! ( ret = 1ll * ret * K[i][i] % p ) ) return 0;
}
return ( ret * swp + p ) % p;
} struct Matrix {
int n, m, mat[MAXN + 5][MAXN + 5];
Matrix () {} Matrix ( const int tn, const int tm ): n ( tn ), m ( tm ), mat {} {}
inline int* operator [] ( const int key ) { return mat[key]; }
inline Matrix operator * ( Matrix t ) {
assert ( m == t.n );
Matrix ret ( n, t.m );
for ( int i = 0; i <= n; ++ i ) {
for ( int k = 0; k <= m; ++ k ) {
for ( int j = 0; j <= t.m; ++ j ) {
ret[i][j] = ( ret[i][j] + 1ll * mat[i][k] * t[k][j] ) % p;
}
}
}
return ret;
}
}; inline Matrix qkpow ( Matrix A, int b ) {
Matrix ret ( A.n, A.m );
for ( int i = 0; i <= A.n; ++ i ) ret[i][i] = 1;
for ( ; b; A = A * A, b >>= 1 ) if ( b & 1 ) ret = ret * A;
return ret;
} int main () {
int T;
for ( scanf ( "%d", &T ); T --; memset ( K, 0, sizeof K ) ) {
scanf ( "%d %d %d %d", &n, &m, &p, &q );
for ( int i = 1, u, v; i <= m; ++ i ) scanf ( "%d %d", &u, &v ), add ( u, v );
int tree = det ( n );
if ( ! tree || q < n - 1 ) { puts ( "0" ); continue; }
Matrix F ( 0, n - 1 ), T ( n - 1, n - 1 );
F[0][0] = 1;
for ( int i = 0; i < n; ++ i ) {
T[i][i] = i;
if ( i ) T[i - 1][i] = n - i;
}
F = F * qkpow ( T, q );
printf ( "%d\n", int ( 1ll * tree * F[0][n - 1] % p ) );
}
return 0;
}

Solution -「HDU 5498」Tree的更多相关文章

  1. Solution -「HDU 6875」Yajilin

    \(\mathcal{Description}\)   Link.(HDU 裂开了先放个私链 awa.)   在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_ ...

  2. Solution -「HDU 6643」Ridiculous Netizens

    \(\mathcal{Description}\)   Link.   给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...

  3. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  4. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  5. Solution -「HDU 1788」CRT again

    \(\mathcal{Description}\)   Link.   解同余方程组: \[x\equiv m_i-a\pmod{m_i} \]   其中 \(i=1,2,\dots,n\).   \ ...

  6. Solution -「HDU #6566」The Hanged Man

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个点的树,每个结点有两个权值 \(a\) 和 \(b\).对于 \(k\in[1,m]\),分别求 \[ ...

  7. Solution -「CF 1375G」Tree Modification

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个结点的树,每次操作选择三个结点 \(a,b,c\),满足 \((a,b),(b,c)\in E\),并令 ...

  8. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  9. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

随机推荐

  1. 在CentOS 7.6 以 kubeadm 安装 Kubernetes 1.15 最佳实践

    前言 Kubernetes作为容器编排工具,简化容器管理,提升工作效率而颇受青睐.很多新手部署Kubernetes由于"scientifically上网"问题举步维艰,本文以实战经 ...

  2. 什么是css Modules

    具体请参考阮一峰老师的博客(http://www.ruanyifeng.com/blog/2016/06/css_modules.html)

  3. SYCOJ1793

    题目-统计单词前缀数 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 map<string,in ...

  4. Flutter 2022 产品路线图发布

    为了提升产品的透明性,每年年初 Flutter 团队都会发布今年度的产品路线图,以帮助使用 Flutter 的团队和开发者们根据这些优先事项制定计划. 2022 年 Flutter 团队将重点通过关注 ...

  5. 手写Webserver

    一.反射 反射Reflection:把java类中的各种结构(方法.属性.构造器.类名)映射成一个个的java对象.利用反射技术可以对一个类进行解剖,反射是框架设计的灵魂 //在运行期间,一个类,只有 ...

  6. 【C++】类-派生和继承

    类-派生和继承 目录 类-派生和继承 1.基本概念 2. 语法 3. 继承方式 4. 类型转换 5. 派生类的构造.析构函数 构造函数 复制构造函数 析构函数 1.基本概念 继承:保持已有类的特性而构 ...

  7. 【笔记】论文阅读:《Gorilla: 一个快速, 可扩展的, 内存式时序数据库》

    英文:Gorilla: A fast, scalable, in-memory time series database 中文:Gorilla: 一个快速, 可扩展的, 内存式时序数据库

  8. 如何获取Repeater行号(索引)、记录总数?

    Repeater控件想必搞ASP.NET开发的人,基本上都到了用的炉火纯青的地步了.今个又吃了懒的亏,翻了好几个项目的代码都没找到如何获取Repeater记录总数的代码来,又Google了半天难得从老 ...

  9. JavaScript之详述闭包导致的内存泄露

    一.内存泄露 1. 定义:一块被分配的内存既不能使用,也不能回收.从而影响性能,甚至导致程序崩溃. 2. 起因:JavaScript的垃圾自动回收机制会按一定的策略找出那些不再继续使用的变量,释放其占 ...

  10. 记一次 .NET 某智能交通后台服务 CPU爆高分析

    一:背景 1. 讲故事 前天有位朋友加微信求助他的程序出现了CPU爆高的问题,开局就是一个红包,把我吓懵了! 由于是南方小年,我在老家张罗处理起来不方便,没有第一时间帮他处理,朋友在第二天上午已经找出 ...