思路:

显然每个子图内都是森林

去掉所有子图1和n都连通且每条大边都存在的情况

直接DP上

NTT优化一波

注意前两项的值..

  1. //By SiriusRen
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. const int mod=,N=;
  5. int cases,n,R[N],fac[N],inv[N],A[N],B[N],h[N],f[N],g[N],jy;
  6. int power(int x,int y){
  7. int r=;
  8. while(y){
  9. if(y&)r=1ll*x*r%mod;
  10. x=1ll*x*x%mod,y>>=;
  11. }return r;
  12. }
  13. void NTT(int *a,int f,int m){
  14. int L=,n;
  15. for(n=;n<m;n<<=)L++;
  16. for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
  17. for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
  18. for(int l=;l<n;l<<=){
  19. int wn=power(,((mod-)/(l<<)*f+(mod-))%(mod-));
  20. for(int j=;j<n;j+=(l<<)){
  21. int w=;
  22. for(int k=;k<l;k++,w=1ll*w*wn%mod){
  23. int x=a[j+k],y=1ll*w*a[j+k+l]%mod;
  24. a[j+k]=(x+y)%mod,a[j+k+l]=(x-y+mod)%mod;
  25. }
  26. }
  27. }
  28. if(f==-){
  29. int ni=power(n,mod-);
  30. for(int i=;i<n;i++)a[i]=1ll*a[i]*ni%mod;
  31. }
  32. }
  33. void cdq(int l,int r){
  34. if(l==r){
  35. if(l==)f[l]=;
  36. else f[l]=(1ll*f[l]*fac[l-]+1ll*h[l]*fac[l-])%mod;
  37. return;
  38. }
  39. int mid=(l+r)>>;
  40. cdq(l,mid);
  41. int len1=mid-l+,len2=r-l+,len=;
  42. while(len<len1+len2)len<<=;
  43. for(int i=;i<len1;i++)A[i]=1ll*f[l+i]*inv[l+i]%mod;
  44. for(int i=len1;i<len;i++)A[i]=;
  45. for(int i=;i<len2;i++)B[i]=h[i];
  46. for(int i=len2;i<len;i++)B[i]=;
  47. NTT(A,,len),NTT(B,,len);
  48. for(int i=;i<len;i++)A[i]=1ll*A[i]*B[i]%mod;
  49. NTT(A,-,len);
  50. for(int i=mid+;i<=r;i++)f[i]=(f[i]+A[i-l])%mod;
  51. cdq(mid+,r);
  52. }
  53. void init(){
  54. fac[]=h[]=;
  55. for(int i=;i<=;i++)fac[i]=1ll*fac[i-]*i%mod;
  56. inv[]=power(fac[],mod-);
  57. for(int i=;~i;i--)inv[i]=1ll*inv[i+]*(i+)%mod;
  58. for(int i=;i<=;i++)h[i]=1ll*power(i,i-)*inv[i-]%mod;
  59. cdq(,),f[]=;
  60. for(int i=;i<;i++)A[i]=B[i]=;
  61. for(int i=;i<=;i++)A[i]=1ll*f[i]*inv[i]%mod;
  62. B[]=B[]=;
  63. for(int i=;i<=;i++)B[i]=1ll*h[i]*(i-)%mod;
  64. NTT(A,,),NTT(B,,);
  65. for(int i=;i<;i++)g[i]=1ll*A[i]*B[i]%mod;
  66. NTT(g,-,),g[]=;
  67. for(int i=;i<=;i++)g[i]=1ll*g[i]*fac[i-]%mod;
  68. }
  69. int main(){
  70. scanf("%d",&cases),init();
  71. while(cases--){
  72. scanf("%d",&n);int a1=,a2=;
  73. for(int i=;i<=n;i++)scanf("%d",&jy),a1=1ll*a1*f[jy]%mod,a2=1ll*a2*g[jy]%mod;
  74. printf("%lld\n",(1ll*a1*power(,n)%mod-a2+mod)%mod);
  75. }
  76. }

HDU 5279 分治NTT 图的计数的更多相关文章

  1. BZOJ 3456 NTT图的计数 容斥

    思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...

  2. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

  3. HDU 5279 YJC plays Minecraft (分治NTT优化DP)

    题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地 ...

  4. 【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】

    Description 定义线图为把无向图的边变成点,新图中点与点之间右边当且仅当它们对应的边在原图中有公共点,这样得到的图. 定义弦图为不存在一个长度大于3的纯环,纯环的定义是在环上任取两个不相邻的 ...

  5. HDU 6270 Marriage (2017 CCPC 杭州赛区 G题,生成函数 + 容斥 + 分治NTT)

    题目链接  2017 CCPC Hangzhou Problem G 题意描述很清晰. 考虑每个家庭有且仅有$k$对近亲的方案数: $C(a, k) * C(b, k) * k!$ 那么如果在第$1$ ...

  6. HDU 5322 Hope (分治NTT优化DP)

    题面传送门 题目大意: 假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块. 定义一个联通块的权值为:联通块内元素数量的平方. 定义一个排列的权值为:每个联通块的权值之 ...

  7. [gdoi2018 day1]小学生图论题【分治NTT】

    正题 题目大意 一张随机的\(n\)个点的竞赛图,给出它的\(m\)条相互无交简单路径,求这张竞赛图的期望强联通分量个数. \(1\leq n,m\leq 10^5\) 解题思路 先考虑\(m=0\) ...

  8. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  9. [hdu 6184 Counting Stars(三元环计数)

    hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...

随机推荐

  1. linux free命令-显示内存的使用情况

    更多Linux 性能监测与优化 关注 Linux命令大全 free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区. 语法 free(选项) 选项 -b:以Byte为单 ...

  2. 什么是restful

  3. linux常用命令大全(linux基础命令+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令+命令备忘录+面试复习)-----https://www.cnblogs.com/caozy/p/9261224.html

  4. vb 运行ppt示例代码

    来源:http://support.microsoft.com/kb/222929 通过使用 PowerPoint 中的自动运行功能,您可以以编程方式打印.显示幻灯片及执行以交互式执行的大多数事情.按 ...

  5. 【Java基础】基本类型与运算【重要】

    0.   Java基本数据类型 Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表 ...

  6. hdu_1205_吃糖果_201404021440

    吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  7. 武大OJ 612. Catch the sheep

    Description Old Sama is a great and powerful magician in the word. One day, a little girl, Anny, tou ...

  8. 关于static静态块的使用和static list的使用

    public class CorsConfiguration { /** * Wildcard representing <em>all</em> origins, metho ...

  9. Solid Edge如何制作装配体的剖视图

    在装配体中,点击检视-剖面   选择剖切方向(向内是指把矩形框之内的东西去掉不要,向外是指把矩形框之外的东西去掉不要),选择剖切深度   最后效果如下图所示   你也可以选择不剖切的零件,效果如下图所 ...

  10. hdu 3342 Legal or Not (拓扑排序)

    重边这样的东西   仅仅能呵呵 就是裸裸的拓扑排序 假设恩可以排出来就YES . else  NO 仅仅须要所有搜一遍就好了 #include <cstdio> #include < ...