トピックへのリンク:https://ac.nowcoder.com/acm/contest/1107/D
問題の意味:ボールからなる環N + M、Nボボ望ましい染め黒いボールがあり、ボールは白に着色mです。同じ色の隣接するボールのボボ右のグループ化は、彼は、製品群として決定される長さを再着色します。彼は、重みの和の色を知りたいかもしれません。1E9 + 7のmodへの答え。
問題解決のアイデア:個人的にこの質問が難しいと感じています。まず、黒と白の領域に塗ら同じ番号を見つけます。その後、我々はすべての可能なiと製品のブロックに分割され、DP j番目のボールの[i]の[j]を定義することができます。そして、状態遷移方程式は次のとおりです。
DP [I] [J] =(JI + 1)* DP [I-1] [I-1] +(JI)* DP [i]は[I-1] +。。。+ 2×DP [I-1] [J-2] + DP [I-1] [J-1]。その後、我々は最小の位置が塗装されてもよいそれぞれの場合を考慮することができる黒い部分は共通のN + M可能、最終的な答えが得られることを見出しました。任意モジュロする、またはQAQをタイムアウトすることがないように注意してください。。。
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 const int型MAXN = 5E3 + 5。 int型DP [MAXN] [MAXN]。 [MAXN] INV int型。 CONST長い長いMOD = 1E9 + 7。 メインINT(){ INV [1] = 1。 以下のために(INT I = 2; iは= 5000 <; iは++){ INVの[I] = 1LL *(MOD-MOD / I)* INV [MOD%I]%MOD。 } DP [0] [0] = 1。 以下のために(INT i = 1; iは= 5000 <; iは++){ int型TEM1 = DP [I-1] [I-1]; int型tem2 = 1LL * DP [I-1]を[I-1] *(I-1)%MOD。 用(int型J = I; J <= 5000; J ++){ DP [I] [J] =(1LL * TEM1の*のJ-tem2 + MOD)%MOD。 TEM1 =(TEM1 + DP [I-1]〜[J])%のMOD。 tem2 =(tem2 + 1LL * jは*のDP [I-1]を[J])%のMOD。 } } N INT、M。 一方、(!のscanf( "%d個の%のD"、&N、&M)= EOF){ int型のTEM =分(N、M)。 長い長いANS = 0; {ため(; iはTEM = <I ++はI = 1 INT) ANS =(ANS + 1LL * DPを[I] [N] * DP [I] [M]%MOD * INV [I])%MOD。 } のprintf( "%LLDする\ n"、1LL * ANS *(N + M)%のMOD)。 } 0を返します。 }