atcoder#ARC066A. [ABC050C] Lining Up

[ABC050C] Lining Up

配点 : 300300

問題文

1N1 \sim N までの番号がついた、NN 人の人がいます。 彼らは昨日、ある順番で左右一列に並んでいましたが、今日になってその並び方が分からなくなってしまいました。 しかし、彼らは全員、「自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値」を覚えています。 彼らの報告によると、人 ii の、「自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値」は AiA_i です。

彼らの報告を元に、元の並び方が何通りあり得るかを求めてください。 ただし、答えは非常に大きくなることがあるので、109+710^9+7 で割った余りを出力してください。 また、彼らの報告が間違っており、ありうる並び方がないこともありえます。 その際は 00 を出力してください。

制約

  • 1N1051 \leq N \leq 10^5
  • 0AiN10 \leq A_i \leq N-1

入力

入力は以下の形式で標準入力から与えられる。

NN

A1A_1 A2A_2 ...... ANA_N

出力

元の並び順としてありうるものが何通りあるか求め、109+710^9+7 で割った余りを出力せよ。

5
2 4 4 0 2
4

ありうる並び方は、人の番号で書くと、

  • 2,1,4,5,32,1,4,5,3
  • 2,5,4,1,32,5,4,1,3
  • 3,1,4,5,23,1,4,5,2
  • 3,5,4,1,23,5,4,1,2

44 通りです。

7
6 4 0 2 4 0 2
0

どのような並び方でも、報告と矛盾するので、00 が答えになります。

8
7 5 1 1 7 3 5 3
16