1 条题解

  • 0
    @ 2025-12-8 21:55:20

    题意重述

    (0,0)(0,0) 出发,恰好 RR跳到 (Tx,Ty)(T_x, T_y)
    每一步:

    • 只能向右上跳:新位置 (newx,newy)(\text{newx},\text{newy}) 满足 xnewxx+Mxx \le \text{newx} \le x+M_xynewyy+Myy \le \text{newy} \le y+M_y
    • 不能原地不动(排除 (0,0)(0,0) 增量)。
    • KK非法向量 (ki,ki)(k_i,k_i),即每一步的横向增量 dxdx 和纵向增量 dydy 不能 同时等于 kik_i(也就是不能沿对角线走长度为 kik_i 的向量)。

    已知 kik_i 都是 GG 的倍数,10000G5000010000 \le G \le 50000

    求方案数,对 109+710^9+7 取模。


    第一步:基本思路

    这是一个 多步二维路径计数 问题,需要走 RR 步,每步 dx,dydx,dy 非负且不同时为零,且 dxMxdx \le M_xdyMydy \le M_y,还要避开 KK 个非法对角线增量。

    设第 tt 步的增量为 (dxt,dyt)(dx_t, dy_t),则:

    $$\sum_{t=1}^R dx_t = T_x, \quad \sum_{t=1}^R dy_t = T_y. $$

    且对每个 tt0dxtMx0 \le dx_t \le M_x0dytMy0 \le dy_t \le M_y(dxt,dyt)(0,0)(dx_t, dy_t) \neq (0,0)(dxt,dyt)(ki,ki)(dx_t, dy_t) \neq (k_i,k_i) 对任何 ii


    第二步:转化为生成函数

    由于每一步独立(除了最后总和限制),可以用生成函数

    对于一步,合法增量集合 SS 定义为:

    $$S = \{ (a,b) \mid 0 \le a \le M_x, \ 0 \le b \le M_y, \ (a,b) \neq (0,0), \ (a,b) \notin \{ (k_i,k_i) \}_{i=1}^K \}. $$

    则一步的生成函数为:

    F(x,y)=(a,b)Sxayb.F(x,y) = \sum_{(a,b) \in S} x^a y^b.

    RR 步的生成函数为 F(x,y)RF(x,y)^R,我们要求其中 xTxyTyx^{T_x} y^{T_y} 的系数。


    第三步:利用 kik_iGG 的倍数

    GG 很大(1045×10410^4 \sim 5\times 10^4),而 Tx,Ty106T_x,T_y \le 10^6Mx,My106M_x,M_y \le 10^6,非法向量只出现在对角线且步长是 GG 的倍数。

    这意味着 非法向量很稀疏(对角线上的 dx=dydx=dy 且为 GG 的倍数)。

    我们可以在计数时先考虑所有合法向量(包括所有非对角线和对角线非法的排除),再减掉非法对角线向量。


    第四步:直接二维生成函数的问题

    二维生成函数幂的系数提取复杂度高,但这里 R1000R \le 1000Tx,TyT_x,T_y 很大,直接二维卷积不可行。

    由于 dx,dydx,dy 独立?不独立,因为有非法对角线限制。
    但我们可以换个角度:
    ut=dxtdytu_t = dx_t - dy_tvt=dxtv_t = dx_t,这样 (dx,dy)=(v,vu)(dx,dy) = (v, v-u)?不,这样不方便。
    不如直接对 dx,dydx,dy 分别考虑,最后合起来。


    关键想法:用容斥处理非法对角线

    非法向量是 (ki,ki)(k_i,k_i),即 dx=dy=kidx=dy=k_i
    如果我们忽略非法限制,一步生成函数是:

    $$F_0(x,y) = \sum_{a=0}^{M_x} \sum_{b=0}^{M_y} x^a y^b - 1 \quad\text{(减去(0,0))}. $$

    即:

    $$F_0(x,y) = \frac{(1-x^{M_x+1})(1-y^{M_y+1})}{(1-x)(1-y)} - 1. $$

    非法向量集合是 B={(ki,ki)i=1..K}B = \{(k_i,k_i) \mid i=1..K\}(去重后)。
    B={g1,g2,,gm}B = \{g_1, g_2, \dots, g_m\},其中 gjg_jGG 的倍数,且 gjmin(Mx,My)g_j \le \min(M_x,M_y)

    容斥原理:合法方案 = 总方案 - 至少用一次非法向量的方案 + 至少用两次非法向量的方案 - ……

    AjA_j 表示“某一步用了非法向量 (gj,gj)(g_j,g_j)”,我们要计算:

    $$\sum_{S \subseteq \{1,\dots,m\}} (-1)^{|S|} \times (\text{所有步都可用任何向量,但必须包含 $S$ 中每个非法向量至少一次,且总步数 $R$,总增量 $(T_x,T_y)$})。 $$

    第五步:容斥后的计数

    如果固定一个非法向量集合 SS,设 SS 中元素(不同的 gjg_j)的集合为 {h1,,ht}\{h_1, \dots, h_t\}
    我们必须保证这 tt 个非法向量每个至少出现一次,其它步任意(包括可再用这些非法向量,因为容斥已经处理了符号)。

    这相当于:
    我们先分配 tt 步,每步强制为 (hs,hs)(h_s, h_s)(对每个 ss 至少一步),总步数 RR,其余 RtR-t 步从 F0(x,y)F_0(x,y) 中任选(可包含非法向量,因为这里已经固定了至少出现一次,其它步随意)。

    这里 tSt \le |S|,但注意 SS 是原 KK 个可能重复的非法向量的一个子集,容斥是按 KK 个非法向量(编号)做的,所以 S|S| 可能大于不同 gjg_j 的数量,但 gjg_j 相同时,它们对应的非法向量相同,容斥时要小心。

    实际上更简单:
    设非法向量有 mm 种不同的值 d1,,dmd_1,\dots,d_m,每种出现了 cjc_j 次(输入可能重复)。

    容斥时,我们枚举 tjt_j 表示第 jj 种非法向量被禁用的次数(0tjcj0 \le t_j \le c_j),符号 (1)tj(-1)^{\sum t_j},然后从 RR 步中选 t=tjt = \sum t_j 步放置这些非法向量(注意不同种非法向量值不同,所以放置时指定种类)。


    第六步:具体公式

    设非法向量种类集合 D={d1,,dm}D = \{d_1,\dots,d_m\},出现次数 cjc_j

    令:

    $$\text{Ans} = \sum_{t_1=0}^{c_1} \cdots \sum_{t_m=0}^{c_m} (-1)^{t_1+\dots+t_m} \binom{c_1}{t_1} \cdots \binom{c_m}{t_m} \times [\text{剩余方案数}]. $$

    其中 (cjtj)\binom{c_j}{t_j} 表示从 cjc_j 个相同的非法向量(编号不同但值相同)中选 tjt_j 个强制使用(在容斥中表示“禁止”这些,但这里容斥是“禁用”,我们反过来做可能更顺)。

    我换一种容斥方式:
    AiA_i 表示“使用了第 ii 个非法向量(按输入编号)”,则我们要求没有 AiA_i 发生。

    由容斥:

    $$\text{合法方案} = \sum_{S \subseteq \{1,\dots,K\}} (-1)^{|S|} \times (\text{强制 $S$ 中非法向量至少各用一次,其它步任意的方案数}). $$

    第七步:强制使用某些非法向量的计数

    SS 中包含的不同非法向量值为 {d1,,dt}\{d_1,\dots,d_t\},每个值 ddSS 中出现 sds_d 次(sd1s_d \ge 1)。

    我们要从 RR 步中选 S|S| 步放置这些非法向量(注意相同值的非法向量不可区分,但这里 SS 中编号不同,所以必须区分?容斥时 SS 是编号集合,所以即使值相同,编号不同也算不同选择,因此排列时要乘上多重组合数)。

    更简单做法:
    f(p1,,pm)f(p_1,\dots,p_m) 表示强制第 jj 种非法向量恰好用 pjp_j 次(pj0p_j \ge 0)的方案数,总步数 RR,总增量 (Tx,Ty)(T_x,T_y)

    那么

    $$f(p_1,\dots,p_m) = \binom{R}{p_1,\dots,p_m,R-\sum p_j} \times \text{剩余步的生成函数系数}. $$

    其中剩余 RpjR-\sum p_j 步从 F0(x,y)F_0(x,y) 中选(可包含非法向量,因为已经固定了 pjp_j 次)。

    剩余步生成函数为 F0(x,y)RpjF_0(x,y)^{R-\sum p_j},需要提取 xTxpjdjyTypjdjx^{T_x - \sum p_j d_j} y^{T_y - \sum p_j d_j} 的系数。注意 dx=dy=djdx=dy=d_j 对于非法向量,所以总 xxyy 增量都减少 pjdj\sum p_j d_j


    第八步:提取 F0(x,y)NF_0(x,y)^N 的系数

    $F_0(x,y) = \frac{(1-x^{M_x+1})(1-y^{M_y+1})}{(1-x)(1-y)} - 1$。

    写为:

    $$F_0(x,y) = \sum_{a=0}^{M_x} \sum_{b=0}^{M_y} x^a y^b - 1. $$

    所以 F0(x,y)NF_0(x,y)^N 是多项式乘积。

    N=RpjR1000N = R-\sum p_j \le R \le 1000,而 Tx,TyT_x,T_y 很大,直接卷积不行,但可以用二维线性递推二维前缀和优化,因为 F0(x,y)F_0(x,y) 的系数是简单的矩形区域全1。

    一个技巧:$F_0(x,y) = (1 + x + \dots + x^{M_x})(1 + y + \dots + y^{M_y}) - 1$。

    那么 $F_0(x,y)^N = \sum_{k=0}^N \binom{N}{k} (-1)^{N-k} (1+x+\dots+x^{M_x})^k (1+y+\dots+y^{M_y})^k$。

    然后 $(1+x+\dots+x^{M_x})^k = \sum_{a=0}^{kM_x} \binom{k+a-1}{a} x^a$(允许 a>kMxa>kM_x 时系数为0,用组合数表示)。这里用组合数公式时要注意是否允许 a>Mxa>M_x 重复,实际上这里是可重复组合数,是对的。

    所以我们可以分开 xxyy

    $$[x^{A} y^{B}] F_0(x,y)^N = \sum_{k=0}^N \binom{N}{k} (-1)^{N-k} \left( [x^A] (1+\dots+x^{M_x})^k \right) \left( [y^B] (1+\dots+y^{M_y})^k \right). $$

    其中 $[x^A] (1+\dots+x^{M_x})^k = \sum_{t=0}^{\lfloor A/(M_x+1)\rfloor} (-1)^t \binom{k}{t} \binom{k+A-t(M_x+1)-1}{A-t(M_x+1)}$,这是用容斥去掉超过 MxM_x 的限制的标准公式。

    这样 A=TxpjdjA = T_x - \sum p_j d_jB=TypjdjB = T_y - \sum p_j d_jN=RpjN = R-\sum p_j


    第九步:算法步骤

    1. 读入数据,对非法向量 kik_i 去重并统计每种出现次数 cjc_j
    2. 枚举每种非法向量的使用次数 pjp_j0pjcj0 \le p_j \le c_j,且 pjRp_j \le R)。
    3. 对每个 (p1,,pm)(p_1,\dots,p_m),计算:
      • 总步数已用 P=pjP = \sum p_j,剩余步 N=RPN = R-P
      • x,yx,y 剩余增量 A=TxpjdjA = T_x - \sum p_j d_jB=TypjdjB = T_y - \sum p_j d_j
      • A<0A<0B<0B<0N<0N<0,方案为0。
      • 计算 W=[xAyB]F0(x,y)NW = [x^A y^B] F_0(x,y)^N 用上述公式。
      • 乘上多重组合数 (Rp1,,pm,N)\binom{R}{p_1,\dots,p_m,N}(注意非法向量种类不同,但同种内不可区分,所以是 R!p1!pm!N!\frac{R!}{p_1!\dots p_m! N!})。
    4. 根据容斥,符号为 (1)pj(-1)^{\sum p_j} 乘以 (cjpj)\prod \binom{c_j}{p_j}?这里要小心:
      我们容斥时是“禁用”某些非法向量,等价于“强制使用”某些非法向量,符号 (1)tj(-1)^{\sum t_j} 且选择方式 (cjtj)\prod \binom{c_j}{t_j}
      所以总贡献为 $(-1)^{\sum p_j} \prod \binom{c_j}{p_j} \times \binom{R}{p_1,\dots,p_m,N} \times W$。
    5. 对所有枚举求和,取模。

    第十步:复杂度

    m50m \le 50,但 R1000R \le 1000pjp_j 枚举看起来很多,但总步数限制 RR,所以总状态数约 (R+mm)\binom{R+m}{m},当 R=1000,m=50R=1000,m=50 时很大,不可行。

    需要优化:注意到 djd_jGG 倍数,GG 很大,所以非法向量值很大(10000\ge 10000),而 Tx,Ty106T_x,T_y \le 10^6,所以 pjp_j 不能大(100\le 100),因此枚举量其实不大。

    实际可做。


    总结

    本题核心:

    1. 用容斥处理非法对角线向量。
    2. 将二维生成函数分解为两个一维问题。
    3. 利用 GG 大导致非法向量稀疏,减少枚举量。
    4. 用组合公式快速计算 [xA](1++xM)k[x^A] (1+\dots+x^{M})^k
    • 1

    信息

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