zoukankan      html  css  js  c++  java
  • [cf923e]Perpetual Subtraction

    • 题目链接

      cf923e

    • 题目大意

      开始有一个随机整数 (x in [0,N])(x)(i) 的概率为 (p_i)

      每轮均等地从 ([0,x]) 中选择一个整数 (x') ,将 (x) 替换为 (x')

      (M) 次操作后,对每个 (i) 求出最后剩余的数为 (i) 的概率。

      (998244353) 取模。

      (Nle 10^5, Mle 10^{18}, p_i<998244353)

    • 题解

      首先每次操作只和之前的状态有关,所以可以抽象为一个 (Markov) 链。

      初始状态为向量 (P) ,转移矩阵就是:

      [A=egin{pmatrix} 1&frac{1}{2}&frac{1}{3}&dots&frac{1}{N+1}\ 0&frac{1}{2}&frac{1}{3}&dots&frac{1}{N+1}\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&dots&frac{1}{N+1} end{pmatrix} ]

      所以我们就是求 (A^MP)

      直接矩阵快速幂肯定不可以接受,考虑优化。

      注意到 (A) 是一个上三角矩阵,那么就可以利用特征值,特征向量和基变换这一套理论。

      (A) 的特征值显然为对角线上的元素。

      那么显然有矩阵:

      [Lambda= egin{pmatrix} 1&0&0&dots&0\ 0&frac{1}{2}&0&dots&0\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&dots&frac{1}{N+1} end{pmatrix} ]

      可以得到特征向量 (v_i=((-1)^{i+j}inom{i}{j})_{j=0}^N)

      那么再构造一个矩阵:

      [V= egin{pmatrix} 1&-1&1&dots&(-1)^N\ 0&1&-2&dots&(-1)^{N+1}inom{N}{1}\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&dots&1 end{pmatrix} ]

      (V) 的每一列为特征向量。

      接下来考虑 (V^{-1}),发现这个特征向量长得很像二项式反演,那么可以直接构造:

      [V^{-1}= egin{pmatrix} 1&1&1&dots&1\ 0&1&2&dots&inom{N}{1}\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&dots&1 end{pmatrix} ]

      手玩一下发现是对的。

      那么根据基变换:

      [V^{-1}·A·V=Lambda\ A=V·Lambda·V^{-1}\ A^M=V·Lambda^M·V^{-1} ]

      所以我们求的就是 (V·Lambda^M·V^{-1}·P)

      其中 (Lambda^M) 可以在 (mathcal O(Nlog M)) 的复杂度求得,那么我们得到了一个 (mathcal O(Nlog M+N^2)) 的做法。

      但这还不够,还要继续优化。

      可以发现一个向量乘 (V)(V^{-1}) 展开是一个经典的卷积,直接 (NTT)

      总复杂度 (mathcal O(N(log M+log N)))

  • 相关阅读:
    python的编码判断_unicode_gbk/gb2312_utf8(附函数)
    stat文件状态信息结构体
    内核配置中 ramdisk 大小修改
    mount命令详解
    dirent和DIR 结构体 表示文件夹中目录内容信息
    nandwrite 参数
    mke2fs 制作ext2文件系统image
    ext2文件系统错误
    照度/感光度(Lux)
    摄像机的几个重要的技术指标
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14546441.html
Copyright © 2011-2022 走看看