题意  给定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)的更多相关文章

  1. hdu 5552 Bus Routes

    hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...

  2. HDU 5552 Bus Routes(NTT+分治)

    题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...

  3. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

  4. HDU 5531 Rebuild (2015长春现场赛,计算几何+三分法)

    Rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  5. HDU 5510 Bazinga (2015沈阳现场赛,子串判断)

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. HDU 5512 Pagodas (2015沈阳现场赛,找规律+gcd)

    Pagodas Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. hdu 5493 (2015合肥网赛) Queue

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5493 题目大意,t组数据,n个人,n行每行分别是人的身高和这个人的左边或右边比他高的人的个数,输出符合条件 ...

  8. hdu 5491(2015合肥网赛)The Next

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5491 题意就是,T组测试数据.然后L,S1,S2.L的二进制中有x个1,x满足  S1<=x< ...

  9. 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)

    HDU 5489 Removed Interval 题意: 求序列中切掉连续的L长度后的最长上升序列 思路: 从前到后求一遍LIS,从后往前求一遍LDS,然后枚举切开的位置i,用线段树维护区间最大值, ...

随机推荐

  1. HDU 5961 传递 BFS

    题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...

  2. JAVA JDBC(存储过程和事务管理)

    1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...

  3. 【51NOD-0】1012 最小公倍数LCM

    [算法]欧几里德算法 #include<cstdio> int gcd(int a,int b) {?a:gcd(b,a%b);} int main() { int a,b; scanf( ...

  4. 【HDU】6012 Lotus and Horticulture (BC#91 T2)

    [算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...

  5. 【洛谷 P4735】 最大异或和 (可持久化Trie)

    题目链接 维护整个数列的异或前缀和和\(s\),然后每次就是要求\(s[N]\text{^}x\text{^}s[k],l-1<=k<=r-1\)的最大值 如果没有\(l\)的限制,那么直 ...

  6. es6异步操作

    异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发 ...

  7. URI设计原则

    以下是与 REST API 相关的重要术语: 资源(Resource) 是一个对象或对某物的表示.它有一些相关联的数据,并有一组方法进行操作. 例如:动物,学校和员工是资源.这些资源都有着删除,添加, ...

  8. 直接在注册DB服务的时候,做beforeQuery事件监听

  9. 阿里云ECS的使用

    一.阿里云ECS的使用 1.Linux CentOS Ubuntu Readhat 2.远程登录 xshell 远程登录 winScp 远程文件操作 3.Linux命令 cd 目录名 ls . ls ...

  10. 数据类型转换(计算mac地址)

    [root@localhost test1]# vim 19.py //add #!/usr/bin/python macaddr = '00:0C:29:D1:6F:E9' prefix_mac = ...