#428. 【集训队作业2018】普通的计数题

模型转化好题

所以变成统计有标号合法的树的个数。

合法限制:

1.根标号比子树都大

2.如果儿子全是叶子,数量B中有

3.如果存在一个儿子不是叶子,数量A中有

然后考虑DP

直接枚举根的儿子的情况

cdq分治NTT还是很恶心的

不光是自己卷自己,还是互相卷

进行一番化简和平移之后,可以转化为cdq分治NTT的形式:

怎么好做怎么来。

反正我最后推的式子有如下特点(式子就不写了):

为了方便,钦定g[0],f[0],g[1],f[1]都是0

对于f,a是固定的,a向右平移一下,然后就是cdq分治的模板题了

对于g,当cdq的分治区间l不是0的时候,要F作为[l,mid],G作为[ql,qr],和G作为[l,mid],F作为[ql,qr]做两遍

这样其实剩下g[n]=g[0]*f[n],但是g[0]=0,所以不用管

代码:

  1. const int N=+;
  2. int jie[N],inv[N];
  3. int f[N],g[N];
  4. int n,sa,sb;
  5. int ta[N],b[N],a[N];
  6. void divi(int l,int r,int ql,int qr){
  7. // cout<<" divi "<<l<<" "<<r<<" ql "<<ql<<" qr "<<qr<<endl;
  8. if(l==&&r==){
  9. f[]=f[]=g[]=g[]=;
  10. return;
  11. }
  12. if(l==r){
  13. f[l]=ad(mul(f[l],jie[l-]),b[l-]);
  14. g[l]=ad(f[l],mul(g[l],jie[l-]));
  15. f[l]=mul(f[l],inv[l-]);
  16. g[l]=mul(g[l],inv[l]);
  17. return;
  18. }
  19. int mid=(l+r)>>;
  20. int qmd=(ql+qr)>>;
  21. divi(l,mid,ql,qmd);
  22. Poly A,G;
  23. A.resize(qr-ql+);
  24. G.resize(mid-l+);
  25. for(reg i=ql;i<=qr;++i){
  26. A[i-ql]=a[i];
  27. }
  28. for(reg i=l;i<=mid;++i){
  29. G[i-l]=g[i];
  30. }
  31. A*=G;
  32. for(reg i=mid+;i<=r;++i){
  33. f[i]=ad(f[i],A[i-l]);
  34. }
  35.  
  36. if(l==){
  37. Poly F;G.clear();
  38. F.resize(mid-l+);
  39. G.resize(mid-l+);
  40. for(reg i=l;i<=mid;++i){
  41. F[i-l]=f[i];
  42. G[i-l]=g[i];
  43. }
  44. F=F*G;
  45. for(reg i=mid+;i<=r;++i){
  46. g[i]=ad(g[i],F[i]);
  47. }
  48. }else{
  49. Poly F;G.clear();
  50. F.resize(qr-ql+);
  51. G.resize(mid-l+);
  52. for(reg i=l;i<=mid;++i){
  53. G[i-l]=g[i];
  54. }
  55. for(reg i=ql;i<=qr;++i){
  56. F[i-ql]=f[i];
  57. }
  58. F=F*G;
  59. for(reg i=mid+;i<=r;++i){
  60. g[i]=ad(g[i],F[i-l]);
  61. }
  62. F.clear();G.clear();
  63. F.resize(mid-l+);
  64. G.resize(qr-ql+);
  65. for(reg i=ql;i<=qr;++i){
  66. G[i-ql]=g[i];
  67. }
  68. for(reg i=l;i<=mid;++i){
  69. F[i-l]=f[i];
  70. }
  71. F=F*G;
  72. for(reg i=mid+;i<=r;++i){
  73. g[i]=ad(g[i],F[i-l]);
  74. }
  75. }
  76. divi(mid+,r,ql,qmd);
  77. }
  78. int main(){
  79. rd(n);rd(sa);rd(sb);int x;
  80. for(reg i=;i<=sa;++i){rd(x);ta[x]=;}
  81. for(reg i=;i<=sb;++i){rd(x);b[x]=;}
  82. if(n==){
  83. puts("");return ;
  84. }
  85. int m;
  86. for(m=;m<=n;m<<=);
  87. jie[]=;
  88. for(reg i=;i<=m;++i) jie[i]=mul(jie[i-],i);
  89. inv[m]=qm(jie[m],mod-);
  90. for(reg i=m-;i>=;--i) inv[i]=mul(inv[i+],i+);
  91.  
  92. for(reg i=;i<=m;++i){
  93. a[i]=mul(ta[i-],inv[i-]);
  94. }
  95. a[]=;
  96.  
  97. divi(,m-,,m-);
  98. ll ans=f[n];
  99. ans=mul(ans,jie[n-]);
  100. ot(ans);
  101. return ;
  102. }

树形结构很巧妙啊

f,g互相卷的分治NTT第一次写,还是举一个0,1,2,3,4,5,6,7的例子最好理解了!

UOJ#428. 【集训队作业2018】普通的计数题的更多相关文章

  1. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  2. UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...

  3. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  4. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  5. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  6. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  7. UOJ#422. 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  8. [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  9. uoj450 【集训队作业2018】复读机(生成函数,单位根反演)

    uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...

随机推荐

  1. minutia cylinder code MCC lSSR 匹配算法

    图一 是LSS匹配算法, 图二是LSSR 匹配算法,数据采用MCC SDK自带的十个人的数据.LSS EER6.0%左右,LSSR EER 0%

  2. redis笔记_源码_内存分配

    文件:zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%-100% ...

  3. Joomla - 优化(时区、google字体、压缩图片、压缩自定义代码)

    Joomla - 优化(时区.google字体.压缩图片.压缩自定义代码) 一.时区 发布文章是往往会发现发布时间和当前时间对不上,原因是 Joomla 用的是国际标准时间,和中国时区大约相差8小时, ...

  4. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  5. IOS学习笔记57--IOS7状态栏适配(二)

    上一遍文章通过XIB的设置达到了状态栏和view重合的问题,这一篇我们讲一讲网传的修改window frame方法. 先上步骤: 第一:在appdeletage里面 添加如下代码:      if ( ...

  6. iOS开发自定义转场动画

    1.转场动画 iOS7之后开发者可以自定义界面切换的转场动画,就是在模态弹出(present.dismiss),Navigation的(push.pop),TabBar的系统切换效果之外自定义切换动画 ...

  7. Delphi遍历进程-Win32API

    本博客的Delphi代码使用的版本均为DelphiXE10.x 1.1 .枚举进程 通过进程名称获取指定的进程ID,代码很详细,不再赘述 unit Uuitls; interface uses TlH ...

  8. WinForm中Dispose()和Close()的区别

    WinForm中Dispose()和Close()的区别 Close()会自动调用Dispose()方法,但是如果窗体是模态的,则不会调用 所以ShowDialog的时候,要用Dispose(),Sh ...

  9. Elasticsearch & Kibana with Shield

    Elasticsearch & Kibana with Shield   官方网站: https://www.elastic.co/guide/en/kibana/current/produc ...

  10. 如何 在 jQuery 中的 $.each 循环中使用 break 和 continue

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...