HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)
题意 给定n个点,任意两点之间可以不连边也可以连边。如果连边的话可以染上m种颜色。
求最后形成的图,是一个带环连通图的方案数。
首先答案是n个点的图减去n个点能形成的树。
n个点能形成的树的方案数比较好求,根据prufer序列可以知道n个点形成的无根树的个数为$n^{n-2}$
那么现在问题变成求n个点形成的连通图的个数。
图有连通和不连通的,那么就是图的总数减去不连通的图的总数。
图的总数很简单,$m^{\frac{n(n-1)}{2}}$,那么现在要求不连通的图的总数。
设$f(n)$为$n$个点的不连通的图的总数
$f(n) = ∑f(i) * C(n - 1, i - 1) * f(n - i)$,$i$从$1$到$n-1$。
这是一个卷积的形式,可以分治NTT来求,就可以了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define fi first
#define se second
#define MP make_pair typedef long long LL; const LL G = 106;
const LL mod = 152076289;
const LL N = 4e4 + 10; int T;
int ca = 0; LL x1[N], x2[N];
LL ans;
LL n, m;
LL f[N], g[N], h[N];
LL c[N], fac[N], ifac[N]; LL Pow(LL a, LL b){
LL ret = 1;
while (b){
if (b & 1) ret = (ret * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ret;
} void change (LL *y, int len){
int i, j, k;
for (i = 1, j = len / 2; i < len - 1; i++) {
if (i < j) swap(y[i], y[j]);
k = len / 2;
while (j >= k) {
j -= k;
k /= 2;
}
if (j < k) j += k;
}
} void ntt (LL *y, int len, int on) {
change (y, len);
int id = 0;
for(int h = 2; h <= len; h <<= 1) {
id++;
LL wn = Pow (G, (mod - 1) / (1<<id));
for(int j = 0; j < len; j += h) {
LL w = 1;
for(int k = j; k < j + h / 2; k++) {
LL u = y[k] % mod;
LL T = w * (y[k + h / 2] % mod) % mod;
y[k] = (u + T) % mod;
y[k + h / 2] = ((u - T) % mod + mod) % mod;
w = w * wn % mod;
}
}
}
if (on == -1){
for (int i = 1; i < len / 2; i++)
swap (y[i], y[len - i]);
LL inv = Pow(len, mod - 2);
for(int i = 0; i < len; i++)
y[i] = y[i] % mod * inv % mod;
}
} void solve(int l, int r){
if (l == r){
f[l] += g[l];
f[l] %= mod;
return;
} int mid = (l + r) >> 1;
solve(l, mid);
int len = 1;
while (len <= r - l + 1) len <<= 1;
rep(i, 0, len - 1) x1[i] = x2[i] = 0; rep(i, l, mid) x1[i - l] = f[i] * ifac[i - 1] % mod;
rep(i, 1, r - l) x2[i - 1] = g[i] * ifac[i] % mod; ntt(x1, len, 1);
ntt(x2, len, 1);
rep(i, 0, len - 1) x1[i] = x1[i] * x2[i] % mod;
ntt(x1, len, -1);
rep(i, mid + 1, r){
f[i] -= x1[i - l - 1] % mod * fac[i - 1] %mod;
(f[i] += mod) %= mod;
}
solve(mid + 1, r);
} int main(){ fac[0] = 1;
rep(i, 1, N - 1) fac[i] = fac[i - 1] * i % mod;
ifac[N - 1] = Pow(fac[N - 1], mod - 2);
dec(i, N - 2, 0) ifac[i] = ifac[i + 1] * (i + 1) % mod; scanf("%d", &T);
while (T--){
scanf("%lld%lld", &n, &m);
memset(f, 0, sizeof f);
rep(i, 1, n) g[i] = Pow(m + 1, 1ll * i * (i - 1) / 2);
solve(1, n);
ans = (f[n] - Pow(n, n - 2) * Pow(m, n - 1) % mod + mod) % mod;
printf ("Case #%d: %lld\n", ++ca, ans);
} return 0;
}
HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)的更多相关文章
- hdu 5552 Bus Routes
hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...
- HDU 5552 Bus Routes(NTT+分治)
题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...
- HDU 4816 Bathysphere (2013长春现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...
- HDU 5531 Rebuild (2015长春现场赛,计算几何+三分法)
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- HDU 5510 Bazinga (2015沈阳现场赛,子串判断)
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 5512 Pagodas (2015沈阳现场赛,找规律+gcd)
Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5493 (2015合肥网赛) Queue
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5493 题目大意,t组数据,n个人,n行每行分别是人的身高和这个人的左边或右边比他高的人的个数,输出符合条件 ...
- hdu 5491(2015合肥网赛)The Next
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5491 题意就是,T组测试数据.然后L,S1,S2.L的二进制中有x个1,x满足 S1<=x< ...
- 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)
HDU 5489 Removed Interval 题意: 求序列中切掉连续的L长度后的最长上升序列 思路: 从前到后求一遍LIS,从后往前求一遍LDS,然后枚举切开的位置i,用线段树维护区间最大值, ...
随机推荐
- ZooKeeper食谱(八)
使用ZooKeeper构造高级别应用的指南 在这个文章中,你将会发现使用ZooKeeper来实现高级别功能的指南.所有的它们在客户端上被实现而不需要ZooKeeper特别的支持.希望社区将注意到这些约 ...
- lombok 配置使用以及优势
maven依赖 <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> ...
- python基础--结构篇
在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同: Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入 ...
- WebDriver中如何处理Iframe 及 嵌套Iframe
最近在用webdriver进行爬虫的时候,遇到了网站存在iframe的情况,处理了好久没有解决,后来发现原来webdriver自带处理方法,汗颜.. 1.iFrame有ID 或者 name的情况 // ...
- 从无到有搭建SSM框架
框架 https://www.cnblogs.com/xiaoL/p/7753130.html log4j配置详解 https://www.cnblogs.com/SummerinShire ...
- Chinese Rings (九连环+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目: Problem Description Dumbear likes to play th ...
- bzoj 2733 平衡树启发式合并
首先对于一个连通块中,询问我们可以直接用平衡树来求出排名,那么我们可以用并查集来维护各个块中的连通情况,对于合并两个平衡树,我们可以暴力的将size小的平衡树中的所有节点删掉,然后加入大的平衡树中,因 ...
- 使用yo -v查看yeoman版本号
使用yo -v无法查看yeoman版本,这是旧版本的方法 新版本使用yo --version即可查看
- Windows 提权对照表 精确到sp版本号
https://www.securitysift.com/download/MS_privesc_and_exploits_table.csv
- 转 Wireshark和TcpDump抓包分析心得
1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话 ...