177AC - ABC050C: Lining Up
ABC050-C (300 points)
問題
以下の条件を満たす 人の並び方の総数を で割った余りを出力する.
- 人 の右側に並んでいる人数と左側に並んでいる人数の差の絶対値は .
方針
- 人 の左に並んでいる人数を とすると, 右に並んでいる人数は となり, 全員で 人であることから
- 条件を満たす並び方がゼロになる場合:
- と偶奇が同じ が存在(このとき が整数にならない).
- に 同じ数が つ以上含まれる( は 通り).
- が奇数のとき, に が つ以上含まれる.
- これら以外の場合, となる 人 は左右を入れ替えることが可能なので, 並び方の総数は 通り.
# input N = int(input()) A = list(map(int, input().split())) cnt = [0 for i in range(N)] ans = 1 if N % 2 == 0: for i in range(N): if A[i] % 2 == 0: print(0) exit() cnt[A[i]] += 1 if cnt[A[i]] > 2: print(0) exit() if cnt[A[i]] == 1: ans = (ans * 2) % (10 ** 9 + 7) print(ans) else: for i in range(N): if A[i] % 2 == 1: print(0) exit() if A[i] > 0: cnt[A[i]] += 1 if cnt[A[i]] > 2: print(0) exit() if cnt[A[i]] == 1: ans = (ans * 2) % (10 ** 9 + 7) if A[i] == 0: cnt[0] += 1 if cnt[0] > 1: print(0) exit() print(ans)