import sys import numpy as np MOD = 10**9 + 7 def main(): data = sys.stdin.buffer.read().split() if not data: return # 入力全体を整数に変換 data = list(map(int, data)) it = iter(data) N = next(it) MAXVAL = 5000 # 入力値の頻度カウント(0<=x<5000 と仮定) C = np.zeros(MAXVAL, dtype=np.int64) for _ in range(N): x = next(it) C[x] += 1 # dp[k] = 「k 個選んだときの通り数」 dp = np.zeros(N + 1, dtype=np.int64) dp[0] = 1 # 各 i について dp を更新(元の内側ループは逆順更新なので vectorized でも OK) for i in range(N): dp[1:] = (dp[1:] + dp[:-1] * C[i]) % MOD # fac[k] = k! mod MOD の計算 fac = np.empty(N + 1, dtype=np.int64) fac[0] = 1 for i in range(1, N + 1): fac[i] = (fac[i - 1] * i) % MOD # (-1)**i を mod MOD で表現(偶数: 1, 奇数: MOD-1) sign = np.empty(N + 1, dtype=np.int64) sign[::2] = 1 sign[1::2] = MOD - 1 # fac[N-i] を得るために、fac 配列を逆順に fac_rev = fac[::-1] # ※ここで np.sum で一括に和を求めると、中間計算で 64bit 整数のオーバーフローする可能性があるので、 # 各項ごとに mod をとりながら和を計算する ans = 0 prod = ((dp * fac_rev) % MOD * sign) % MOD for x in prod: ans = (ans + int(x)) % MOD sys.stdout.write(str(ans)) if __name__ == '__main__': main()