Time-3 - I'm Not Blind!

2 secs 1024 MB
matcharate12's icon matcharate12

この問題は順列全列挙を問います。

問題から A=(A1,A2,...,AN)A=(A_1,A_2,...,A_N) がランダムな順番で言い渡されると書いてあるので、単に A1,A2,...,ANA_1,A_2,...,A_N の順で計算するとは限りません。

このランダムな順番は、最悪 N!N! 通り存在します( AiA_i はすべて相異なると仮定する時)。制約から 1N81\le N\le 8 であるため、8!=403208!=40320 通りを全列挙することが適切です。
そのうち B1,B2,...,BMB_1,B_2,...,B_M 番目を撃ち落とせなかったと書かれていますが、これは言い換えれば 11 以上 NN 以下の整数からなる順列 (1,2,...,N)(1,2,...,N) を並び替えた数列 P=(P1,P2,...,PN)P=(P_1,P_2,...,P_N) に対し、PB1=PB2=...=PBM=0P_{B_1}=P_{B_2}=...=P_{B_M}=0 として計算することを表しています。この挙動を実装できると、正解することができます。

以上から O(N!N)O(N!N) で実装することが可能です。以下は解答例になります(C++)。

  • C++
  • Python