HDU 5279 分治NTT 图的计数
思路:
显然每个子图内都是森林
去掉所有子图1和n都连通且每条大边都存在的情况
直接DP上
NTT优化一波
注意前两项的值..
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int mod=,N=;
int cases,n,R[N],fac[N],inv[N],A[N],B[N],h[N],f[N],g[N],jy;
int power(int x,int y){
int r=;
while(y){
if(y&)r=1ll*x*r%mod;
x=1ll*x*x%mod,y>>=;
}return r;
}
void NTT(int *a,int f,int m){
int L=,n;
for(n=;n<m;n<<=)L++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int l=;l<n;l<<=){
int wn=power(,((mod-)/(l<<)*f+(mod-))%(mod-));
for(int j=;j<n;j+=(l<<)){
int w=;
for(int k=;k<l;k++,w=1ll*w*wn%mod){
int x=a[j+k],y=1ll*w*a[j+k+l]%mod;
a[j+k]=(x+y)%mod,a[j+k+l]=(x-y+mod)%mod;
}
}
}
if(f==-){
int ni=power(n,mod-);
for(int i=;i<n;i++)a[i]=1ll*a[i]*ni%mod;
}
}
void cdq(int l,int r){
if(l==r){
if(l==)f[l]=;
else f[l]=(1ll*f[l]*fac[l-]+1ll*h[l]*fac[l-])%mod;
return;
}
int mid=(l+r)>>;
cdq(l,mid);
int len1=mid-l+,len2=r-l+,len=;
while(len<len1+len2)len<<=;
for(int i=;i<len1;i++)A[i]=1ll*f[l+i]*inv[l+i]%mod;
for(int i=len1;i<len;i++)A[i]=;
for(int i=;i<len2;i++)B[i]=h[i];
for(int i=len2;i<len;i++)B[i]=;
NTT(A,,len),NTT(B,,len);
for(int i=;i<len;i++)A[i]=1ll*A[i]*B[i]%mod;
NTT(A,-,len);
for(int i=mid+;i<=r;i++)f[i]=(f[i]+A[i-l])%mod;
cdq(mid+,r);
}
void init(){
fac[]=h[]=;
for(int i=;i<=;i++)fac[i]=1ll*fac[i-]*i%mod;
inv[]=power(fac[],mod-);
for(int i=;~i;i--)inv[i]=1ll*inv[i+]*(i+)%mod;
for(int i=;i<=;i++)h[i]=1ll*power(i,i-)*inv[i-]%mod;
cdq(,),f[]=;
for(int i=;i<;i++)A[i]=B[i]=;
for(int i=;i<=;i++)A[i]=1ll*f[i]*inv[i]%mod;
B[]=B[]=;
for(int i=;i<=;i++)B[i]=1ll*h[i]*(i-)%mod;
NTT(A,,),NTT(B,,);
for(int i=;i<;i++)g[i]=1ll*A[i]*B[i]%mod;
NTT(g,-,),g[]=;
for(int i=;i<=;i++)g[i]=1ll*g[i]*fac[i-]%mod;
}
int main(){
scanf("%d",&cases),init();
while(cases--){
scanf("%d",&n);int a1=,a2=;
for(int i=;i<=n;i++)scanf("%d",&jy),a1=1ll*a1*f[jy]%mod,a2=1ll*a2*g[jy]%mod;
printf("%lld\n",(1ll*a1*power(,n)%mod-a2+mod)%mod);
}
}
HDU 5279 分治NTT 图的计数的更多相关文章
- BZOJ 3456 NTT图的计数 容斥
思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...
- HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)
题意 给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...
- HDU 5279 YJC plays Minecraft (分治NTT优化DP)
题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地 ...
- 【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】
Description 定义线图为把无向图的边变成点,新图中点与点之间右边当且仅当它们对应的边在原图中有公共点,这样得到的图. 定义弦图为不存在一个长度大于3的纯环,纯环的定义是在环上任取两个不相邻的 ...
- HDU 6270 Marriage (2017 CCPC 杭州赛区 G题,生成函数 + 容斥 + 分治NTT)
题目链接 2017 CCPC Hangzhou Problem G 题意描述很清晰. 考虑每个家庭有且仅有$k$对近亲的方案数: $C(a, k) * C(b, k) * k!$ 那么如果在第$1$ ...
- HDU 5322 Hope (分治NTT优化DP)
题面传送门 题目大意: 假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块. 定义一个联通块的权值为:联通块内元素数量的平方. 定义一个排列的权值为:每个联通块的权值之 ...
- [gdoi2018 day1]小学生图论题【分治NTT】
正题 题目大意 一张随机的\(n\)个点的竞赛图,给出它的\(m\)条相互无交简单路径,求这张竞赛图的期望强联通分量个数. \(1\leq n,m\leq 10^5\) 解题思路 先考虑\(m=0\) ...
- 【BZOJ-3456】城市规划 CDQ分治 + NTT
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...
- [hdu 6184 Counting Stars(三元环计数)
hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...
随机推荐
- 用python写了一个猜年龄小游戏
写一个猜年龄游戏: 需要实现用户登录的功能 初始用户登录信息为 {'hades': '13579','nick': '123','ruixing': 'a1','fanping': 'b2'} 登录时 ...
- pxc增量备份
###增备数据库,如果后续还需要再次增备,则可以再次指定--extra-lsndir,如果与上次备份指定相同的位置,该文件被覆盖# innobackupex --compress --incremen ...
- Java Syntax Specification
Java Syntax Specification Programs <compilation unit> ::= <package declaration>? <imp ...
- Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用
Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...
- CodeForces 1000F One Occurrence
You are given an array $a$ consisting of $n$ integers, and $q$ queries to it. $i$-th query is denote ...
- 洛谷 P1877 BZOJ 2748 cogs 791 [HAOI2012]音量调节
题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...
- noip模拟赛 洗澡
分析:首先肯定是要用线性筛把素数全部给筛出来的,然后可以维护一个前缀和数组记录1~i个素数的和,对于每一个询问可以从n到1+k枚举它的右端点,然后利用前缀和统计一个长度为K的区间和,看看是不是满足条件 ...
- [bzoj1001]狼爪兔子[平面图的最小割等于其对偶图的最短路]
一定要仔细算内存,,,又少写一个零.. #include <bits/stdc++.h> using namespace std; template<const int _n,con ...
- BZOJ5089: 最大连续子段和
维护一个序列支持以下操作:区间加,区间求最大子段和.n<=50000,m<=50000. 我TM再也不写分块了... 先分块,对于块整体加的操作,假设块里面有若干二元组(x,y),表示一个 ...
- codevs——1517 求一次函数解析式
1517 求一次函数解析式 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 相信大家都做过练习册上的这种 ...