1 条题解

  • 0
    @ 2025-10-28 15:40:12

    题目大意

    我们有两种奥术宝石:

    • 2型kk 个核心,每个核心是 2×n2 \times n 网格,用 1×21 \times 2 骨牌铺满
    • 3型kk 个核心,每个核心是 3×n3 \times n 网格,用 1×21 \times 2 骨牌铺满

    定义

    • F(n,k)F(n,k):2型宝石,宽度 nnkk 个核心的不同咒术数
    • G(n,k)G(n,k):3型宝石,宽度 nnkk 个核心的不同咒术数

    咒术kk 个核心的填充方案互不相同的有序组合。

    问题:给定 l,r,kl, r, k,求

    $$\mathrm{ans} = \frac{1}{r-l+1} \sum_{n=l}^r F(n,k) \quad (\text{或 } G(n,k)) $$

    结果对 998244353998244353 取模。


    第一步:理解 F(n,k)F(n,k)G(n,k)G(n,k) 的组合意义

    ana_n 表示 2×n2 \times n 网格的骨牌铺满方案数(2型),bnb_n 表示 3×n3 \times n 网格的骨牌铺满方案数(3型)。

    那么:

    • ana_n 种方案中选出 kk互不相同的方案,有序排列,就是 F(n,k)F(n,k)
    • 同理 G(n,k)G(n,k) 是从 bnb_n 种方案中选 kk 个互不相同的方案有序排列

    因此:

    $$F(n,k) = a_n \cdot (a_n - 1) \cdots (a_n - k + 1) = \frac{a_n!}{(a_n - k)!} $$$$G(n,k) = b_n \cdot (b_n - 1) \cdots (b_n - k + 1) = \frac{b_n!}{(b_n - k)!} $$

    (当 k>ank > a_nF(n,k)=0F(n,k) = 0,同理 G(n,k)G(n,k)


    第二步:求 ana_nbnb_n 的递推式

    2型宝石 2×n2 \times n 网格铺骨牌

    经典问题,递推关系:

    a0=1, a1=1, an=an1+an2a_0 = 1,\ a_1 = 1,\ a_n = a_{n-1} + a_{n-2}

    ana_n 是斐波那契数列:

    an=Fibn+1a_n = \text{Fib}_{n+1}

    具体:

    • a0=1,a1=1,a2=2,a3=3,a4=5,a5=8,a_0=1, a_1=1, a_2=2, a_3=3, a_4=5, a_5=8, \dots

    3型宝石 3×n3 \times n 网格铺骨牌

    经典递推:

    b0=1, b1=0, b2=3b_0 = 1,\ b_1 = 0,\ b_2 = 3 bn=4bn2bn4(n4)b_n = 4b_{n-2} - b_{n-4} \quad (n \ge 4)

    或者另一种形式:

    bn=4bn2bn4b_n = 4b_{n-2} - b_{n-4}

    其中 b3=0,b4=11,b5=0,b6=41,b_3=0, b_4=11, b_5=0, b_6=41, \dotsnn 为奇数时 bn=0b_n=0

    但题目中 nn 应该是任意正整数,这里可能 3×n3 \times nnn 为奇数时无法铺满?样例中 G(2,2)=3G(2,2)=3 对应 b2=3b_2=3 正确。

    实际上标准递推是:

    b0=1,b2=3,b4=11,b6=41,b_0=1, b_2=3, b_4=11, b_6=41,\dots bn=4bn2bn4b_n = 4b_{n-2} - b_{n-4}

    对于奇数 nnbn=0b_n=0


    第三步:将 F(n,k)F(n,k)G(n,k)G(n,k) 写成多项式形式

    定义下降阶乘幂:

    xk=x(x1)(xk+1)x^{\underline{k}} = x(x-1)\cdots(x-k+1)

    则:

    $$F(n,k) = a_n^{\underline{k}}, \quad G(n,k) = b_n^{\underline{k}} $$

    我们可以将 xkx^{\underline{k}} 展开为普通多项式:

    xk=j=0ks(k,j)xjx^{\underline{k}} = \sum_{j=0}^k s(k,j) x^j

    其中 s(k,j)s(k,j)第一类斯特林数(带符号)。

    因此:

    F(n,k)=j=0ks(k,j)anjF(n,k) = \sum_{j=0}^k s(k,j) a_n^j G(n,k)=j=0ks(k,j)bnjG(n,k) = \sum_{j=0}^k s(k,j) b_n^j

    第四步:求和转化为线性递推数列求和

    我们需要计算:

    $$S = \sum_{n=l}^r F(n,k) = \sum_{j=0}^k s(k,j) \sum_{n=l}^r a_n^j $$

    (对 GG 同理)

    问题转化为:对每个 jj,计算 n=lranj\sum_{n=l}^r a_n^j


    第五步:利用线性递推数列的性质

    ana_n(斐波那契数列)

    ana_n 满足线性递推:

    an=an1+an2a_n = a_{n-1} + a_{n-2}

    特征方程:x2x1=0x^2 - x - 1 = 0

    对于线性递推数列,anja_n^j 也满足某个线性递推(根据 Cayley–Hamilton 定理),递推阶数至多 (j+1)(j+1)

    因此我们可以:

    1. 找到 anja_n^j 的线性递推关系
    2. 用矩阵快速幂求前 nn 项和

    bnb_n3×n3 \times n 铺砖数列)

    bnb_n 满足:

    bn=4bn2bn4b_n = 4b_{n-2} - b_{n-4}

    特征方程:x44x2+1=0x^4 - 4x^2 + 1 = 0

    同样,bnjb_n^j 也满足线性递推。


    第六步:具体算法步骤

    预处理:

    1. 计算斯特林数 s(k,j)s(k,j)998244353998244353 取模,k501k \le 501
    2. 对每个 j=0..kj=0..k,找到 anja_n^jbnjb_n^j 的线性递推关系

    对每个询问 (l,r,k)(l,r,k)

    1. j=0..kj=0..k
      • 计算 Aj=n=lranjA_j = \sum_{n=l}^r a_n^j(用矩阵快速幂求线性递推数列区间和)
    2. $ans = \frac{1}{r-l+1} \sum_{j=0}^k s(k,j) A_j \bmod 998244353$

    第七步:处理大范围 l,r1018l,r \le 10^{18}

    由于 l,rl,r 巨大,我们必须用矩阵快速幂来计算线性递推的区间和。

    对于线性递推:

    $$u_n = c_1 u_{n-1} + c_2 u_{n-2} + \dots + c_m u_{n-m} $$

    我们可以构造转移矩阵 MM,使得:

    $$\begin{bmatrix} u_n \\ u_{n-1} \\ \vdots \\ u_{n-m+1} \end{bmatrix} = M \cdot \begin{bmatrix} u_{n-1} \\ u_{n-2} \\ \vdots \\ u_{n-m} \end{bmatrix} $$

    并且前缀和 Sn=i=1nuiS_n = \sum_{i=1}^n u_i 也可以通过扩展矩阵来递推。


    第八步:实现细节

    anja_n^j(斐波那契的幂):

    斐波那契数列的 jj 次幂的线性递推阶数 = j+1j+1(实际上更小,但上界是 j+1j+1

    我们可以用矩阵:

    $$\begin{bmatrix} a_n^j & a_{n-1}^j & \dots & a_{n-j}^j \end{bmatrix} $$

    但更简单的方法:直接对向量 (an,an1)(a_n, a_{n-1}) 做矩阵快速幂得到 ana_n,然后快速幂求 anja_n^j?不行,nn 太大。

    正确方法:利用 ana_n 的线性递推性质,anja_n^j 也线性递推,用 Berlekamp–Massey 算法找到递推式,然后矩阵快速幂求和。

    bnjb_n^j(3型铺砖的幂):

    bnb_n 本身递推阶数=4,bnjb_n^j 的递推阶数 4j\le 4j


    第九步:复杂度分析

    • 斯特林数预处理:O(k2)O(k^2)
    • 对每个 jj,矩阵大小 O(j)O(j),矩阵快速幂 O(j3logr)O(j^3 \log r)
    • 总复杂度:O(kk3logr)=O(k4logr)O(k \cdot k^3 \log r) = O(k^4 \log r)

    k501k \le 501k46×1010k^4 \approx 6\times 10^{10} 太大,需要优化。

    实际上 anja_n^j 的递推阶数 j+1\le j+1,但 j501j \le 501,矩阵大小 502\le 50250231.3×108502^3 \approx 1.3\times 10^8,再乘 logr60\log r \approx 60,约 8×1098\times 10^9,仍很大。

    需要进一步优化:

    • 利用斐波那契的闭形式(通项公式)an=ϕnψn5a_n = \frac{\phi^n - \psi^n}{\sqrt{5}},其中 $\phi = \frac{1+\sqrt{5}}{2}, \psi = \frac{1-\sqrt{5}}{2}$
    • 那么 anj=5j/2(ϕnψn)ja_n^j = 5^{-j/2} (\phi^n - \psi^n)^j
    • 二项展开:$a_n^j = 5^{-j/2} \sum_{t=0}^j \binom{j}{t} (-1)^t \phi^{n(j-t)} \psi^{nt}$
    • 于是 $\sum_{n=l}^r a_n^j = 5^{-j/2} \sum_{t=0}^j \binom{j}{t} (-1)^t \sum_{n=l}^r (\phi^{j-t} \psi^t)^n$

    这是一个等比数列求和,可以直接公式计算。


    第十步:最终算法(对2型宝石)

    1. 预处理组合数和斯特林数
    2. 计算 $\phi = \frac{1+\sqrt{5}}{2}, \psi = \frac{1-\sqrt{5}}{2}$ 在模 998244353998244353 下的值(可能需要扩域)
    3. 对每个 j=0..kj=0..k
    $$ A_j = \sum_{n=l}^r a_n^j = 5^{-j/2} \sum_{t=0}^j \binom{j}{t} (-1)^t \frac{(\phi^{j-t}\psi^t)^l - (\phi^{j-t}\psi^t)^{r+1}}{1 - \phi^{j-t}\psi^t} $$

    (注意处理公比为1的情况) 4. ans=1rl+1j=0ks(k,j)Ajans = \frac{1}{r-l+1} \sum_{j=0}^k s(k,j) A_j

    对3型宝石,bnb_n 也有闭形式(涉及 3\sqrt{3}),类似处理。


    总结

    本题的关键步骤:

    1. 将咒术数转化为下降阶乘幂
    2. 利用斯特林数展开为普通幂次和
    3. 利用线性递推数列的闭形式,将区间和转化为等比数列求和
    4. 模意义下处理无理数(扩域或找模平方根)

    这样可以在 O(k2logr)O(k^2 \log r) 时间内处理每个询问,满足大数据要求。

    • 1

    信息

    ID
    4496
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者