ARC145F Modulo Sum of Increasing Sequences 解题记录
题意:
给定 \(n,m,M\),对每个 \(k \in [0,M-1]\) 求有多少个长度为 \(n\) 的不降序列 \(A\),满足:
- \(A_i \in [0,m]\)
- \(\sum A_i \bmod M = k\)
\(1 \le n,m \le 10^6\)
\(1 \le M \le 500\)
题意看上去非常典。
首先给第 \(i\) 个位置上的数字加上 \(i-1\),那么就变成了上升序列。
下面令 \(m \to m+n-1\),剩下的问题是一个经典的单位根反演。
考虑 \(m\) 是 \(M\) 倍数的情况,可以知道答案显然是:
施加单位根反演,令 \(F(x)=[y^n]\prod_{i=0}^m (1+x^iy)\)。
即我们需要对每个 \(k\) 求得:
提出这个 \(\dfrac{1}{M}\) 在最后计算。
我们考虑展开 \(F\):
令 \(d=\gcd(j,M)\),可得:
枚举 \(t=M/d\),则:
考虑后面的式子,因为我们有 \((j,t)=1\),因此直接有:
(考察 \(y^t=1\) 的因式分解。)
令 \(n\) 是 \(t\) 的倍数,答案显然是:
注意到 \(\sum_{j=0}^{t-1} w_{t}^{-jk}=\sum_{d|t} \sum_{j=0}^{d-1} [(j,d)=1]w_{d}^{-jk}\).
直接运用莫比乌斯反演可得:
因此上式等于
记 \(w=\lfloor\dfrac{m}{M}\rfloor\times M\),考虑计算 \((w,m]\) 的贡献。
大力 dp 出 \((w,m]\) 内,使用的数字个数;\(\bmod M\) 的值;此时的方案数。
预处理后面一个 \(\sum\) 的值,即可在 \(O(n+m+M^3\ln M)\) 的时间内通过此题。
事实上会被卡常,精心思考一下,可以去掉那个 \(\ln\)。
随机卡卡常其实也可以过。