AT_arc112_f [ARC112F] Die Siedler
首先考虑最终状态下该如何操作,显然能换牌就换牌。然而问题仍然非常复杂,该怎么继续思考呢?
我们打开题解发现,在这个问题中,对于一个局面 \((c_1,c_2,\cdots,c_n)\),与另一个局面 \((k,0,\cdots,0)\) 是等价的,为什么呢?因为我们有能换就换的策略,对于第一种牌若不断采取能换就换的策略,肯定可以到达第一种局面。
我们采取这种巧妙的方式使问题变得更加简单。对于每个牌堆或者牌包现在都能用一个数表示了,具体的,我们设 \(d_i\) 表示这个数,那么 \(d_i=\sum_{i=1}^n s_{i,j}2^{i-1}(i-1)!\)。然而,如果 \(d_i\ge 2^nn!\) 怎么办?显然我们会让它操作一轮,然后使 \(d_i\leftarrow d_i-(2^nn!)+1\)。
那么设最终牌数为 \(T\),则
\[T=S+\sum_{i=1}^m d_ix_i+(1-2^nn!)x_{m+1}
\]
如果令 \(d_{m+1}=1-2^nn!\),并将 \(S\) 移项,于是这会是一个 \(m+1\) 元的不定方程,而我们可以并不关心解,我们只需要对于每个 \(T\) 判断是否有解即可,可以用裴蜀定理判,设 \(G=\gcd(d_1,d_2,\cdots,d_{m+1})\),如果 \(G\) 很小,我们可以使用同余最短路,如果 \(G\) 很大,则 \(T=Gk+S\bmod G\),可以直接枚举 \(T\)。
然后就做完啦!