hdu 5552 Bus Routes
hdu 5552 Bus Routes
考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了。
无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} $ 其中又由于有 $ n-1 $ 个边,每个边可以涂色,所以总共无环的方案数量是 $ m^{n-1} n^{n-2} $
那么现在就要算连通图的数量了。这个不如不连通图的数量好算。
不连通图的数量怎么算呢,原本想的是容斥,但是貌似不好实现,看了题解发现一种神仙思路。考虑固定一个点,并且让这个点连出一个连通块,剩下的点随意连,必然不连通。并且由于最后图中一定有这个点,这样是可以不重不漏计算所有情况的。
考虑用 $ s(i) $ 表示 $ i $ 个点的图的方案总数,就是 $ (m+1)^{\frac{n(n+1)}{2}} $ ,一共有 $ \frac{n(n+1)}{2} $ 个边,可以选择 $ m $ 种颜色的一种或者不要这个边。
考虑 $ f(i) $ 表示 $ i $ 个点的连通图的方案数。
$ f(n) = g(n) - \displaystyle\sum_{i=1}^n \binom{i-1}{n-1} f(i)g(n-i) $
这个看起来就很分治NTT
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
#define P 152076289
#define MAXN (1 << 19) + 13
int n , m;
int a[MAXN];
int Pow(int x,int y) {
int res=1;
while(y) {
if(y&1) res=res*(ll)x%P;
x=x*(ll)x%P,y>>=1;
}
return res;
}
int wn[2][MAXN];
void getwn(int l) {
for(int i=1;i<(1<<l);i<<=1) {
int w0=Pow(106,(P-1)/(i<<1)),w1=Pow(106,P-1-(P-1)/(i<<1));
wn[0][i]=wn[1][i]=1;
for(int j=1;j<i;++j)
wn[0][i+j]=wn[0][i+j-1]*(ll)w0%P,
wn[1][i+j]=wn[1][i+j-1]*(ll)w1%P;
}
}
int rev[MAXN];
void getr(int l) { for(int i=1;i<(1<<l);++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<l-1); }
void NTT(int *A,int len,int f) {
for(int i=0;i<len;++i) if(rev[i]<i) swap(A[i],A[rev[i]]);
for(int l=1;l<len;l<<=1)
for(int i=0;i<len;i+=(l<<1))
for(int k=0;k<l;++k) {
int t1=A[i+k],t2=A[i+l+k]*(ll)wn[f][l+k]%P;
A[i+k]=(t1+t2)%P;
A[i+l+k]=(t1-t2+P)%P;
}
if( f == 1 ) for(int inv=Pow(len,P-2),i=0;i<len;++i) A[i]=A[i]*(ll)inv%P;
}
int f[MAXN];
int A[MAXN] , B[MAXN];
int J[MAXN] , invJ[MAXN] , s[MAXN];
void CDQ(int *a,int *b,int l,int r){
if( l == r ) { a[l] += s[l] , a[l] %= P; return; }
int m = l + r >> 1;
CDQ( a , b , l , m );
int p = 1 , len = 0;
while( p <= ( r - l + 1 ) * 2 ) p <<= 1 , ++ len;
getr( len ) , getwn( len );
for( int i = 0 ; i < p ; ++i ) A[i] = B[i] = 0;
for( int i = l ; i <= m ; ++i ) A[i - l] = 1ll * a[i] * invJ[i - 1] % P;
for( int i = 0 ; i <= r - l ; ++i ) B[i] = 1ll * s[i] * invJ[i] % P;
NTT( A , p , 0 ) , NTT( B , p , 0 );
for( int i = 0 ; i < p ; ++i ) A[i] = 1ll * A[i] * B[i] % P;
NTT( A , p , 1 );
for( int i = m + 1 ; i <= r ; ++i ) a[i] = ( a[i] - 1ll * J[i - 1] * A[i-l] % P + P ) % P;
CDQ( a , b , m + 1 , r );
}
int kase = 0;
signed main() {
J[0] = invJ[0] = 1;
for( int i = 1 ; i < MAXN ; ++ i )
J[i] = 1ll * J[i - 1] * i % P , invJ[i] = Pow( J[i] , P - 2 );
int T;cin >> T;
while( T --> 0 ) {
cin >> n >> m; m %= P;
memset( f , 0 , sizeof f ) , memset( s , 0 , sizeof s );
for( int i = 1 ; i <= n ; ++ i )
s[i] = Pow( m + 1 , 1ll * i * ( i - 1 ) / 2 % ( P - 1 ) );
f[0] = 1;
CDQ( f , a , 0 , n );
int x;
printf("Case #%d: %d\n",++ kase,( f[n] - 1ll * Pow(n, n - 2) * Pow(m, n - 1) % P + P) % P);
}
}
hdu 5552 Bus Routes的更多相关文章
- HDU 5552 Bus Routes(NTT+分治)
题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...
- HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)
题意 给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...
- URAL 1137 Bus Routes(欧拉回路路径)
1137. Bus Routes Time limit: 1.0 secondMemory limit: 64 MB Several bus routes were in the city of Fi ...
- [LeetCode] Bus Routes 公交线路
We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For e ...
- [Swift]LeetCode815. 公交路线 | Bus Routes
We have a list of bus routes. Each routes[i]is a bus route that the i-th bus repeats forever. For ex ...
- LeetCode解题报告—— Bus Routes
We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For e ...
- [LeetCode] 815. Bus Routes 公交路线
We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For e ...
- 【leetcode】815. Bus Routes
题目如下: We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. ...
- HDU 3420 -- Bus Fair ACM
Bus Fair Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
随机推荐
- 【c++ Prime 学习笔记】第17章 标准库特殊设施
17.1 tuple类型 tuple是类似pair的模板: pair和tuple的成员类型都可以不相同 pair恰好有两个成员,tuple可有任意数量的成员 按照不同参数数量和类型实例化出的tuple ...
- TX-LCN分布式事务之LCN模式
什么是LCN模式 LCN模式是TX-LCN分布式事务模式的一种,L-lock-锁定事务单元.C-confirm-确认事务模块状态. notify-通知事务单元 原理 LCN模式是通过Spring AO ...
- Redis的浅入门
Redis的浅入门 # 缓存的思想 问题提出:我们的用户数量上亿,如果登录,访问数据库user特别耗时,该怎么办?--提出缓存 方法:怎样从缓存在获取数据? *有数据: 直接返回 *无数据: (1)从 ...
- 高频面试题:一张图彻底搞懂Spring循环依赖
1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...
- golang常用库:cli命令行/应用程序生成工具-cobra使用
golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...
- Hadoop的安装与部署
一.硬件及环境 服务器:3台,IP分别为:192.168.100.105.192.168.100.110.192.168.100.115 操作系统:Ubuntu Server 18.04 JDK:1. ...
- cm2 逆向分析
目录 cm2 逆向分析 前言 查壳 逆向分析 encrypt函数 POC代码 cm2 逆向分析 前言 这是逆向实战之CTF比赛篇的第3篇,在这里我就不再讲的特别小白了,有些简单操作可能会略过. 查壳 ...
- centos 下安装docker
官方文档比较累赘,简化就三步 1.安装依赖 yum -y install gcc gcc-c++ yum-utils device-mapper-persistent-data lvm2 2.添加re ...
- druid连接泄露故障分析
1.问题的如何发生的 1.1.应用功能介绍 系统是一个双数据源双写单独的服务.(两个数据源是不同的存储,所以无法使用主从复制的模式,是一个切换存储介质的过渡态). 历史代码有个更新逻辑update x ...
- mongodb安装教程(一)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/fengtingYan/article/de ...