\(\mathcal{Description}\)

  Link.

  有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\)。进行 \(m\) 轮变换,每次均匀随机取整数 \(r\in[0,x]\),令 \(x\leftarrow r\)。求变换完成后 \(x=i~(i=0..n)\) 的概率。答案模 \(998244353\)。

\(\mathcal{Solution}\)

  令向量 \(\boldsymbol p\) 为此时 \(x\) 的取值概率,显然一次变换是对 \(\boldsymbol p\) 的线性变换 \(A\),有

\[A=\begin{bmatrix}
1&\frac{1}{2}&\cdots&\frac{1}{n}&\frac{1}{n+1}\\
&\frac{1}{2}&\cdots&\frac{1}{n}&\frac{1}{n+1}\\
&&\ddots&\vdots&\vdots\\
&&&\frac{1}{n}&\frac{1}{n+1}\\
&&&&\frac{1}{n+1}
\end{bmatrix}.
\]

  我们的目标即为求出 \(A^m\boldsymbol p\)。注意到 \(A\) 的特征值很明显——\(\lambda_i=\frac{1}{i+1},i\in[0,n]\),所以可以考虑将其对角化来加速矩阵幂的计算。手算一下 \(\lambda_i\) 所对应的特征向量 \(\boldsymbol v_i\),发现一组特解

\[\boldsymbol v_i=\begin{bmatrix}
\binom{i}{0}\\
-\binom{i}{1}\\
\binom{i}{2}\\
\vdots\\
(-1)^n\binom{i}{n}
\end{bmatrix},
\]

那么 \(V=\begin{bmatrix}\boldsymbol v_0&\boldsymbol v_1&\cdots&\boldsymbol v_n\end{bmatrix}\) 有

\[V_{ij}=(-1)^i\binom{j}{i}.
\]

  尝试对 \(V\) 求逆,由于

\[\begin{aligned}
V_{ij}^2 &= \sum_{k=0}^{n-1}(-1)^i\binom{k}{i}\cdot(-1)^k\binom{j}{k}\\
&= \sum_{k=0}^{n-1}(-1)^{i+k}\binom{j}{i}\binom{j-i}{k-i}\\
&= (-1)^i\binom{j}{i}\sum_{k=0}^{n=1}(-1)^k\binom{j-i}{k-i}\\
&= (-1)^i\binom{j}{i}(1-1)^{j-i}\\
&= [i=j],
\end{aligned}
\]

所以 \(V=V^{-1}\)。因此答案为

\[V\begin{bmatrix}
\lambda_0^m\\
&\lambda_1^m\\
&&\ddots\\
&&&\lambda_n^m
\end{bmatrix}V\boldsymbol p.
\]

其中 \(V\) 的变换效果是一个差卷积,NTT 实现即可。复杂度 \(\mathcal O(n\log n)\)。

\(\mathcal{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) typedef long long LL; const int MAXL = 1 << 18, MOD = 998244353, G = 3;
int n, p[MAXL + 5], fac[MAXL + 5], ifac[MAXL + 5];
LL m; inline int sgn(const int u) { return u & 1 ? MOD - 1 : 1; }
inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
} inline void init() {
fac[0] = 1;
rep (i, 1, n) fac[i] = mul(i, fac[i - 1]);
ifac[n] = mpow(fac[n], MOD - 2);
per (i, n - 1, 0) ifac[i] = mul(i + 1, ifac[i + 1]);
} inline void ntt(const int n, int* u, const int tp) {
static int rev[MAXL + 5]; int lgn = 31 - __builtin_clz(n);
rep (i, 1, n - 1) rev[i] = rev[i >> 1] >> 1 | (i & 1) << lgn >> 1;
rep (i, 0, n - 1) if (i < rev[i]) std::swap(u[i], u[rev[i]]);
for (int stp = 1; stp < n; stp <<= 1) {
int wi = mpow(G, (MOD - 1) / (stp << 1));
for (int j = 0; j < n; j += stp <<1 ) {
for (int wk = 1, k = j; k < j + stp; ++k, wk = mul(wk, wi)) {
int ev = u[k], ov = mul(wk, u[k + stp]);
u[k] = add(ev, ov), u[k + stp] = sub(ev, ov);
}
}
}
if (!~tp) {
std::reverse(u + 1, u + n);
int inv = mpow(n, MOD - 2);
rep (i, 0, n - 1) u[i] = mul(u[i], inv);
}
} inline void transV() {
static int f[MAXL + 5], g[MAXL + 5];
int len = 1 << 32 - __builtin_clz((n << 1) - 1);
rep (i, 0, len - 1) f[i] = g[i] = 0;
rep (i, 0, n - 1) f[i] = mul(fac[i], p[i]), g[i] = ifac[n - 1 - i];
ntt(len, f, 1), ntt(len, g, 1);
rep (i, 0, len - 1) f[i] = mul(f[i], g[i]);
ntt(len, f, -1);
rep (i, 0, n - 1) p[i] = mul(mul(sgn(i), ifac[i]), f[n - 1 + i]);
} int main() {
scanf("%d %lld", &n, &m);
++n, m %= MOD - 1, init();
rep (i, 0, n - 1) scanf("%d", &p[i]); transV();
rep (i, 0, n - 1) p[i] = mul(p[i], mpow(i + 1, MOD - 1 - m));
transV();
rep (i, 0, n - 1) printf("%d%c", p[i], i < repi ? ' ' : '\n');
return 0;
}

Solution -「CF 923E」Perpetual Subtraction的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  5. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  6. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  7. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  8. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

  9. Solution -「CF 487E」Tourists

    \(\mathcal{Description}\)   Link.   维护一个 \(n\) 个点 \(m\) 条边的简单无向连通图,点有点权.\(q\) 次操作: 修改单点点权. 询问两点所有可能路 ...

随机推荐

  1. 阿里云服务器 配置 tomcat 发布spring boot项目 的具体操作 【使用公网ip】

    1.前言 spring boot 转成war包 后用tomcat发布的具体操作在我另一篇随笔有详细记载,不论是window系统还是Linux系统,tomcat的发布配置都是一样的,所以这里不具体讲这个 ...

  2. linux服务器之间传输文件的四种方式

    linux文件传输在内网渗透中至关重要,所以我在此总结一下几种Linux服务器之间传输文件的四种方式 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法]scp就是se ...

  3. 关于在Vue中使用WebScoket的随笔

    声明:请勿直接复制粘贴抄袭文章,若有需要,请规范转载,注明出处,谢谢! ---------------------------------------------------------------- ...

  4. host解析

    首先了解一下什么是hosts文件: hosts是一个没有扩展名的系统文件,可以用记事本等文本编辑工具打开,起作用就是将一些常用的"网址域名"与其对应的"IP地址" ...

  5. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  6. VictoriaMerics学习笔记(2):核心组件

    核心组件 1. 单机版 victoria-metrics-prod 单一二进制文件 读写都在一个节点上 作者推荐单机版 特性 merge方式配置 通过HTTP协议提供服务 内存限制(防止OOM) 使用 ...

  7. Android系统编程入门系列之硬件交互——通信硬件NFC

    在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...

  8. go面试题-基础类

    go基础类 1. go优势 * 天生支持并发,性能高 * 单一的标准代码格式,比其它语言更具可读性 * 自动垃圾收集比java和python更有效,因为它与程序同时执行 go数据类型 int stri ...

  9. linux设置系统用户密码

    目录 一:系统用户密码 1.设置用户密码 一:系统用户密码 1.设置用户密码 1.交互式方法 passwd [用户名] 2.免交互式 echo [设置密码] | passwd --stdin [用户名 ...

  10. 配置Nginx使用Active Directory 做认证

    配置Nginx使用AD做认证 nginx.conf 配置 http { ldap_server ldap { url ldap://xxx:389/DC=test,DC=com?sAMAccountN ...