0%

ABC-419-E - Subarray Sum Divisibility(len连续段和都是M倍数的所需最少操作数,操作是让一个元素增加1)

思路讲解

(A[1]++A[len])modM=0(A[1]+\dots+A[len]) \bmod M = 0

(A[2]++A[len+1])modM=0(A[2]+\dots+A[len+1]) \bmod M = 0

(A[1]+A[len+1])modM=0(-A[1]+A[len+1])\bmod M=0

Sumi+LSumi(modM)(i=0,,NL).Sum_{i+L}≡Sum_i(\bmod M)(∀i=0,…,N−L).

https://chatgpt.com/c/68a1e9d2-d4f4-832a-bc89-13ae40f158c5

br 是指的差值的模(模M)。具体来讲,就是 (A[1]+A[len+1])modM=0(-A[1]+A[len+1])\bmod M=0(A[0]+A[len])modM=0(-A[0]+A[len])\bmod M=0 这种位置很多,他们成周期性出现,即是:

b1=A[1]modM=A[len+1]modM=A[2len+1]modMb_1=A[1]\bmod M=A[len+1]\bmod M=A[2len+1]\bmod M \cdots

那么,不难发现,除了要满足传递性,还要满足初始条件,即:

b1+b2++blen0(modM)b_1+b_2​+⋯+b_{len}​≡0 \pmod M

然后可以定义一个dp数组,dp[i][j]dp[i][j] 表示已经选了前 i 个数字,且 sumj(modM)sum\equiv j\pmod M 所需的代价为几(sum=b1+b2++bisum=b_1+b_2+\cdots+b_i)?

为了快速计算这个dp,可以使用一个辅助数组g[i][j]g[i][j] 是指b[i]b[i] 到达b[i]j(modM)b[i]\equiv j \pmod M 所需要的总代价。朴素计算需要O(LMNL)O(MN)O(LM \frac{N}{L}) \Rightarrow O(MN) ( 好像还可以?)

AC代码

https://atcoder.jp/contests/abc419/submissions/68614283

心路历程(WA,TLE,MLE……)