题目大意
有一个长度为 nnn 的数列 a1a_1a1~ana_nan,进行 mmm 次操作,每次操作给定一个整数 kkk(1≤k≤31 \leq k \leq 31≤k≤3),将 aaa 数列变成 bbb 数列:
bi=∑1≤i−kj≤iai−kjb_i=\sum_{1 \leq i-kj \leq i} a_{i-kj}bi=1≤i−kj≤i∑ai−kj
求最终的数列。
1≤n≤105, 1≤m≤106, 1≤ai≤1091 \leq n \leq 10^5,~~1 \leq m \leq 10^6,~~1 \leq a_i \leq 10^91≤n≤105, 1≤m≤106, 1≤ai≤109
\\
\\
\\
题解
您好,您的多项式能力为 0,请做题
先是有一个经典的转换:设 aaa 数列的生成函数为 A=∑aixiA=\sum a_ix^iA=∑aixi,考虑 aaa 数列经过一次 kkk 操作变成 bbb 数列,那么它们的生成函数是这样的:
B=∑bixi=(∑aixi)(∑xik)=A∑xikB=\sum b_ix^i=(\sum a_ix^i)(\sum x^{ik})=A\sum x^{ik}B=∑bixi=(∑aixi)(∑xik)=A∑xik
一次操作相当于给 AAA 乘一个多项式,那么操作顺序是不要紧的,因此三种操作分别对应三个多项式:(∑xi)m1(\sum x^i)^{m_1}(∑xi)m1、(∑x2i)m2(\sum x^{2i})^{m_2}(∑x2i)m2、(∑x3i)m3(\sum x^{3i})^{m_3}(∑x3i)m3。
然后这三个多项式都可以先算出来(系数都是组合数),那么对于原序列就是 3 次 NTT 的事儿。
时间 O(nlogn)O(n \log n)O(nlogn)
代码
//待填坑