题意  给定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_pairtypedef 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;
}

  

转载于:https://www.cnblogs.com/cxhscst2/p/9804908.html

HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)相关推荐

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

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

  2. 树形DP+并查集+左偏树, HDU-5575,Discover Water Tank,2015上海现场赛D题

    只是ACM/IICPC 2015 上海区域赛的一道题.原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5575 题目描述 N-1个木板把一个水箱划分成了N ...

  3. hdu5489(2015合肥网络赛F题)

    转载自:http://blog.csdn.net/lwt36/article/details/48774103 题意: 给出一个数列,在其中删除连续的L个数字,使得剩余的数字LIS最大,输出此LIS. ...

  4. hdu5491(2015合肥网络赛H题)

    题意: 给出三个数字D.s1和s2,用L来表示D的二进制表示中1的个数,L在区间[s1,s2]中,我们要找到离D最近的并且大于D的一个数字,且这个数字的L也落在区间[s1,s2]中. 思路: 一直超时 ...

  5. hdu5492(2015合肥网络赛I题)

    题意: n*m的格子,每个格子有权值,我们要从左上角走到右下角,只能向下走或者向右走,求走到终点走过的格子的方差的最小值. 思路: 被这题坑了,我还是太蠢. 我们可以暴力(∑Ai)^2,取最优就好了. ...

  6. HDU5575 Discover Water Tank 2015上海现场赛D题 (树形dp,并查集,左偏树)

    题目大意: 有一个1维的长度为N,高度无限的水柜,现在要用N-1个挡板将其分为N个长度为1的小格,然后向水柜中注水,水可以低于挡板也可以以溢出去(这样就要与旁边格子的水位相同),现在有M次探测,探测i ...

  7. 2015 上海网赛 HDU5469 树分治

    /* *Rainto96 *Beijing University of Posts and Telecommunications School of Software Engineering *htt ...

  8. 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)

    http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...

  9. 2016ACM/ICPC亚洲区大连站现场赛题解报告

    此文章可以使用目录功能哟↑(点击上方[+]) 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原本过的人数比较多的题结果重现过的变少了,而原本现场赛全场过的人最少的题重现做 ...

最新文章

  1. 路由器远程登陆配置:02多人登陆一台设备
  2. 《从零开始学Swift》学习笔记(Day5)——我所知道的标识符和关键字
  3. 在Win7的IIS上搭建FTP服务及用户授权
  4. Ubuntu安装源安装nodejs
  5. JFreeChart应用实例-折线图
  6. 在linux中查看端口信息,怎样在 Linux 上查看某个端口的相关信息?
  7. 台湾大学林轩田机器学习技法课程学习笔记10 -- Random Forest
  8. 超小型php框架,MiniFramework
  9. LeetCode 210. 课程表 II(拓扑排序)
  10. 负载均衡工具 haproxy 集群安装部署完整流程
  11. 1复数与复变函数(一)
  12. mysql的数据层基类_C# 基于MySQL的数据层基类(MySQLHelper)
  13. winform打包项目
  14. pandas如何往mysql追加数据
  15. Spark 0.9.1 MLLib 机器学习库简介
  16. ios safari 模拟器_Safari调试iOS应用
  17. SSIS ODBC方式连接mysql数据库、oracle数据库
  18. java实现NC数据等值线等值面可视化
  19. C#——初识Console
  20. 【知识图谱】知识图谱数据库提供一站式全域行业数据融合

热门文章

  1. 动态生成CheckBox(Winform程序)
  2. PostgreSQL9.3中文手册的在线纠错
  3. 简单的鼠标可拖动div 兼容IE/FF
  4. 性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项
  5. 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...
  6. 根据Android架构分层推荐开发书籍
  7. vmware redhat5.4 磁盘阵列 RIDA
  8. 【HDOJ】1058 Humble Numbers
  9. 组策略部署软件----将部署的软件分类
  10. ASP.NET中常用功能代码总结(5)——文件操作篇