zoukankan      html  css  js  c++  java
  • [2020-2021集训队作业]带加强和多项木

    • 题目链接

      loj#3398

    • 题目大意

      求有多少叶子数为 (n) 的树满足所有非叶节点的儿子数 (xin S)

      (T) 组询问,(S) 预先给定,答案对 (M) 取模。

      (1le nle 10^{18},2le max{s|sin S},Mle 50,1le Tle 100,1 otin S)

    • 前言

      (Huge{ ext{stO EI Orz}})

    • 题解

      显然考虑生成函数,设答案的生成函数为 (F(x)) ,那么:

      [F(x)=x+sum_{iin S}F(x)^i\ F(x)-sum_{iin S}F(x)^i=x ]

      显然想到拉格朗日反演,构造函数 (G(x)=x-sum_{iin S}x^i) ,那么有:

      [[x^n]F(x)=frac{1}{n}[x^{n-1}]left(frac{x}{G(x)} ight)^n ]

      这并不能做,因为不保证 (n) 在模 (M) 意义下有逆。

      然后考虑 ( ext{EI}) 在今年 ( ext{WC2021}) 提出的另类拉格朗日反演,有:

      [[x^n]F(x)=[x^{n-1}]G'(x)left(frac{x}{G(x)} ight)^{n+1} ]

      这样我们就成功规避了除法,现在问题转化为求一个多项式的高阶幂的问题。

      接下来我们仅考虑模数是质数或质数次幂的情况,因为更一般的情况可以直接 (CRT) 求得。

      设该质数为 (p)

      先考虑模 (p)

      根据历年的一些经典题目,我们可以得到多项式高阶幂模质数的一个重要性质:

      [F(x)^pequiv F(x^p)pmod p ]

      证明即考虑多项式系数 (inom{p}{a_1,dots,a_m}) ,其模 (p) 不为 (0) 当且仅当 (a_1=p) ,此时值为 (1) ,证毕。

      那么我们可以考虑设计一个算法,每次将规模 (/p) ,就可以解决这个问题。

      具体而言,考虑计算 ([x^m]A(x)B(x)^n),令 (m=pm_1+r_m,n=pn_1+r_n),然后我们进行一些推导:

      [egin{aligned} &[x^m]A(x)B(x)^n\ equiv&[x^{pm_1+r_m}]A(x)B(x)^{pn_1+r_n}\ equiv&[x^{pm_1+r_m}](A(x)B(x)^{r_n})B(x)^{pn_1}pmod p end{aligned} ]

      (A(x)B(x)^{r_n}=sum_{r=0}^{p-1}x^rC_r(x^p)) ,那么:

      [egin{aligned} &[x^{pm_1+r_m}](A(x)B(x)^{r_n})B(x)^{pn_1}\ equiv&[x^{pm_1+r_m}]x^{r_m}C_{r_m}(x^p)B(x)^{pn_1}\ equiv&[x^{pm_1}]C_{r_m}(x^p)B(x^p)^{n_1}\ equiv&[x^{m_1}]C_{r_m}(x)B(x)^{n_1}pmod p end{aligned} ]

      这样我们就可以递归了,预处理出所有 (B^r) ,令 (A,B) 的项数为 (k),那么复杂度是 (mathcal O((kp)^2+Tk^2log_p n))

      接下来考虑模 (p^u)

      根据上方的讨论,我们自然希望多项式高阶幂模 (p^u) 也有类似性质。

      事实上对 (p^u (uin ^+)) ,我们都有:

      [F(x)^{p^u}equiv F(x^p)^{p^{u-1}}pmod {p^u} ]

      考虑归纳证明,(u=1) 由上可知成立,对于 (u> 1) ,设 (F(x)^{p^u}=F(x^p)^{p^{u-1}}+p^uG(x)) ,那么:

      [egin{aligned} F(x)^{p^{u+1}}=&(F(x^p)^{p^{u-1}}+p^uG(x))^p\ =&sum_{i=0}^pinom{p}{i}F(x^p)^{ip^{u-1}}p^{(p-i)u}G(x)^{p-i}\ equiv&F(x^p)^{p^u}pmod {p^{u+1}} end{aligned} ]

      最后一步转化与上面类似,那么即得原命题成立。

      这样我们令 (A_0(x)=A(x)B(x)^{nmod p^{u-1}},B_0(x)=B(x)^{p^{u-1}},n'=[n/p^{u-1}]) ,就可以直接套用原来的方法计算了,复杂度 (mathcal O((p^uk)^2+T(p^{u-1}k)^2log_p n))

  • 相关阅读:
    十分钟学会Java8:lambda表达式和Stream API
    史上最全的Spring Boot Cache使用与整合
    史上最全的Spring Boot Starter开发手册
    深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)
    深入理解Mybatis技术与原理
    c++入门之命名空间存在的意义
    机器学习第一篇——最近邻kNN
    Python学习第十八篇——低耦合函数设计思想
    Python学习第十六篇——异常处理
    Python学习第十五篇——类继承和类实例化
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14552848.html
Copyright © 2011-2022 走看看