zoukankan      html  css  js  c++  java
  • [cf1349f2]Slime and Sequences

    • 题目链接

      cf1349f2

    • 题目大意

      定义一个序列 (p) 合法当且仅当对于任意 (i>1)(i) 最后出现前出现了 (i-1)

      对于所有的 (iin[1,n]) ,求 (i) 在所有合法序列 (p) 中的出现次数和。

      答案对 (998244353) 取模。

      (nle 10^5)

    • 题解

      直接对着定义很不好搞,我们考虑构造一个双射 (f)

      不妨设 (i) 的出现位置为 (x_{i,1}<x_{i,2}dots<x_{i,s_i}) ,那么我们发现题目中的条件相当于是 (x_{i,s_i}>x_{i-1,1}) 。那么我们如果将这个位置序列这么排列 (x_{1,s_1},x_{1,s_1-1}dots,x_{1,1} x_{2,s_1}dots) ,就得到一个 (n) 阶排列,并且这和原序列一一对应。

      这个排列的相邻元素的大小关系确定,所以我们可以利用欧拉数求解(令 (k)(k+1) 的答案),有:

      [Ans_k=sum_{i=1}^nA(i,k)inom{n}{i}(n-i)! ]

      那么我们直接递推欧拉数((A(n,k)=(n-k)A(n-1,k-1)+(k+1)A(n-1,k)))就可以在 (mathcal O (n^2)) 的复杂度解决问题。

      当然这是远远不够的。

      考虑定义一个 (SA(n,k)) 表示至少有 (k) 个小于号的方案,那么有二项式反演:

      [A(n,k)=sum_{i=k}^n(-1)^{i-k}inom{i}{k}SA(n,i) ]

      考虑将排列中小于号的连成一段,那么可以得到:

      [SA(n,k)=n![x^n](e^x-1)^{n-k} ]

      代入原式,有:

      [Ans_k=sum_{i=1}^nsum_{j=k}^i(-1)^{j-k}inom{j}{k}SA(i,j)inom{n}{i}(n-i)!\ =sum_{i=1}^ninom{n}{i}(n-i)!i!sum_{j=k}^i(-1)^{j-k}inom{j}{k}[x^i](e^x-1)^{i-j}\ =n!sum_{j=k}^n(-1)^{j-k}inom{j}{k}sum_{i=j}^n[x^i](e^x-1)^{i-j}\ =(-1)^kfrac{n!}{k!}sum_{j=k}^nfrac{(-1)^jj!}{(j-k)!}[x^j]sum_{i=0}^{n-j}(frac{e^x-1}{x})^i ]

      那么我们只需要求出 ([x^j]sum_{i=0}^{n-j}(frac{e^x-1}{x})^i) 就可以直接卷积了。

      (F(x)=frac{e^x-1}{x}) ,那么有:

      [[x^j]sum_{i=0}^{n-j}F^i\ =[x^j]frac{1-F^{n-j+1}}{1-F}\ =[x^j]frac{1}{1-F}-[x^j]frac{F^{n-j+1}}{1-F}\ ]

      前面的可以直接做,后面的我们给 (F) 乘上 (x) ,有:

      [ [x^j]frac{F^{n-j+1}}{1-F}=[x^{n+1}]frac{(xF)^{n-j+1}}{1-F} ]

      有一个神奇的事情,就是我们可以加入一个元区分信息,得到:

      [[x^{n+1}]frac{(xF)^{n-j+1}}{1-F}\ =[x^{n+1}y^{n-j+1}]frac{(xyF)^{n-j+1}}{1-F}\ =[x^{n+1}y^{n-j+1}]sum_ifrac{(xyF)^i}{1-F}\ =[x^{n+1}y^{n-j+1}]frac{1}{1-F}frac{1}{1-xyF} ]

      所以我们就是要求一个以 (y) 为主元的多项式。

      然后我们考虑拉格朗日反演,设 (P(x)=xF(x),H(P(x))=F(x)) ,那么有 (frac{P(x)}{H(P(x))}=x)

      再设 (G(x)=frac{1}{1-H}frac{1}{1-xy}) ,那么有:

      [G(P)=frac{1}{1-H(P)}frac{1}{1-yP}=frac{1}{1-F}frac{1}{1-xyF}\ ]

      所以就是求 ([x^{n+1}]G(P)) ,设 (P(x)) 复合逆为 (T(x)) ,所以:

      [frac{P(T)}{H(P(T))}=T o frac{x}{T}=H ]

      直接反演得:

      [[x^{n+1}]G(P)=frac{1}{n+1}[x^{n}]G’left(frac{x}{T} ight)^{n+1}\ =frac{1}{n+1}[x^n]frac{y+H'-yH-xyH'}{(1-H)^2(1-xy)^2}H^{n+1}\ =frac{1}{n+1}[x^n]left(frac{y}{(1-H)(1-xy)^2}+frac{H'}{(1-H)^2(1-xy)} ight)H^{n+1}\ ]

      考虑提取 (y^m) 项系数:

      [frac{1}{n+1}[x^ny^m]left(frac{y}{(1-H)(1-xy)^2}+frac{H'}{(1-H)^2(1-xy)} ight)H^{n+1}\ =frac{1}{n+1}left([x^ny^m]frac{H^{n+1}}{1-H}sum_i(i+1)x^iy^{i+1}+[x^ny^m]frac{H'H^{n+1}}{(1-H)^2}sum_ix^iy^i ight)\ =frac{1}{n+1}left([x^{n-m+1}]frac{mH^{n+1}}{1-H}+[x^{n-m}]frac{H'H^{n+1}}{(1-H)^2} ight) ]

      那么问题就在于如何求 (H(x)) ,这可以直接构造:

      [P(x)=xF(x), H(P(x))=F(x)\ P(x)=e^x-1\ H(e^x-1)=frac{e^x-1}{x}\ H(x)=frac{x}{ln(x+1)} ]

      这样我们就做完了,复杂度 (mathcal O(nlog n))(mathcal O(nlog^2n)) ,取决于如何求快速幂。

      有些多项式求逆时常数项不为 (0) ,直接平移即可。

  • 相关阅读:
    【LeetCode】17. Letter Combinations of a Phone Number
    【LeetCode】16. 3Sum Closest
    【LeetCode】15. 3Sum 三个数和为0
    【LeetCode】14. Longest Common Prefix 最长前缀子串
    【LeetCode】13. Roman to Integer 罗马数字转整数
    【LeetCode】12. Integer to Roman 整型数转罗马数
    【LeetCode】11. Container With Most Water
    【LeetCode】10. Regular Expression Matching
    Models of good programmer
    RSA Algorithm
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14546484.html
Copyright © 2011-2022 走看看