http://arc077.contest.atcoder.jp/tasks/arc077_b
ARC077に参加。CとEは結構すぐわかった。D解けないのはさすがにまずい。
余事象で考えればすぐわかる。ずっと足し合わせで求めようとして頭がこんがらがった。
でも足し合わせても求められるくらい頭良くしないと。
int N; int A[MAX_N]; int L, R; int cnt[MAX_N]; void solve() { cin >> N; N++; rep(i, 0, N + 1) { cin >> A[i]; cnt[A[i]]++; } int t = -1; rep(i, 1, N + 1) { if(cnt[i] == 2) t = i; } int prev = -1; rep(i, 0, N + 1) { if(t == A[i]) { if(prev == -1) { prev = i; L = prev; } else { R = N - i - 1; break; } } } fac[0] = 1; fac[1] = 1; rep(i, 2, N + 1) { fac[i] = fac[i - 1] * i % mod; } rep(i, 1, N + 1) { cout << (C_(N, i) - C_(L + R, i - 1) + mod) % mod << "\n"; } }