izumo’s diary

主に競プロの精進記録

AtCoder Regular Contest 102 E - Stop. Otherwise...

E - Stop. Otherwise...

問題

互いに区別しないK面サイコロをN個振る。どの異なる2つのサイコロの出目の和も i\ (=2,\ 3,\ ...,\ 2K)\ にならないような出目の組の場合の数を998244353で割った余りを求めよ。

制約

1 \leq K \leq 2000
2 \leq N \leq 2000

解法

解説pdfとは異なり、包除原理を用いて解いた。

まず、区別しないK面サイコロの出目の組は{}_KH_N通りである。

問題文の条件は以下のように置き換えられる。

  • ai-aは同時に出ない
  • a+1i-(a+1)は同時に出ない
  • \vdots
  • bi-bは同時に出ない

この条件の個数をqとすると、
\begin{eqnarray} q=\left\{ \begin{array}{ll} \left\lfloor \frac{i}{2} \right\rfloor & (i\leq k+1) \\ K-\left\lfloor \frac{i}{2} \right\rfloor+1 & (i> k+1) \\ \end{array} \right. \end{eqnarray}

包除原理を用いると、
\begin{eqnarray}\mbox{(求める場合の数)} &=& \mbox{(条件を0個以上満たさない場合の数)} \\ &\quad& - \mbox{(条件を1個以上満たさない場合の数)}\\ &\quad& + \mbox{(条件を2個以上満たさない場合の数)}\\ &\quad& \vdots \\ &\quad& +(-1)^q \times \!\!\! \mbox{(条件を}q\mbox{個以上満たさない場合の数)} \\ &=& \sum_{p=0}^{q} (-1)^p \times {}_qC_p \times {}_KH_{N-2p} \end{eqnarray}

iについてO(q)=O(K)なので、全体はO(K^2)で求められる。

ACコード