Problem p03314 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

typedef long long ll;
const int N = 25400, K = 432, mod = 1000000007;

int n, m, R;
int a[N], c[K], d[K];
int f[N], g[N];
int fact[K], finv[K];

inline void add(int &x, const int y) { x += y - mod, x += x >> 31 & mod; }
ll PowerMod(ll a, int n, ll c = 1) {
  for (; n; n >>= 1, a = a * a % mod)
    if (n & 1)
      c = c * a % mod;
  return c;
}

void init(int n) {
  int i;
  for (*fact = i = 1; i <= n; ++i)
    fact[i] = (ll)fact[i - 1] * i % mod;
  finv[n] = PowerMod(fact[n], mod - 2);
  for (i = n; i; --i)
    finv[i - 1] = (ll)finv[i] * i % mod;
}

inline ll iA(int n, int r) { return (ll)finv[n] * fact[n - r] % mod; }

namespace DP {
int B1[K];

inline void step(int *f) {
  int i, g = mod - f[R - 1];
  memcpy(B1, f, R << 2), *B1 = B1[1];
  for (i = R - 1; i; --i)
    f[i] = (B1[i - 1] * (R - i + 1ll) + g) % mod;
}

inline void init(int *f) {
  int i;
  f[R] = 0;
  for (i = R - 1; i; --i)
    add(f[i], f[i + 1]);
}

inline void trans(int len, int *f, int *g) {
  int i;
  *g = f[1];
  for (i = 1; i <= len; ++i)
    step(f), g[i] = f[1];
}
} // namespace DP

int main() {
  int i, j, l = 0, r = 0, x, kinds = 0, ans = 0, I;
  scanf("%d%d%d", &n, &R, &m), init(K);
  I = PowerMod(R, n - m, n - m + 1);
  for (i = 0; i < m + R; ++i) {
    if (i < m) {
      scanf("%d", a + i), kinds += !c[x = a[i]]++;
      if (c[x] == 2)
        l || (l = i);
    }
    if (i >= R) {
      kinds -= !--c[x = a[i - R]];
      if (c[x] == 1)
        r = m - (i - R) - 1;
    }
    if (kinds == R)
      return printf("%d\n", I), 0;
  }
  assert(R > 1), memset(c, 0, (K + 1) << 2);
  if (l) {
    assert(l < R && r < R);
    c[l] = 1, DP::init(c), DP::trans(n - m, c, f);
    d[r] = 1, DP::init(d), DP::trans(n - m, d, g);
    for (i = 0; i <= n - m; ++i)
      ans = (ans + (ll)f[i] * g[n - m - i]) % mod;
  } else {
    assert(m < R);
    c[1] = R, DP::init(c);
    d[1] = (m == 1 ? R : 0), DP::init(d);
    for (i = 1; i < n; ++i) {
      DP::step(c), DP::step(d);
      for (j = 0; j < m; ++j)
        add(d[j], c[m]);
      for (; j < R; ++j)
        add(d[j], c[j]);
    }
    ans = d[1] * iA(R, m) % mod;
  }
  ans = I - ans;
  printf("%d\n", ans + (ans >> 31 & mod));
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

typedef long long ll;
const int N = 25400, K = 432, mod = 1000000007;

int n, m, R;
int a[N], c[K], d[K];
int f[N], g[N];
int fact[K], finv[K];

inline void add(int &x, const int y) { x += y - mod, x += x >> 31 & mod; }
ll PowerMod(ll a, int n, ll c = 1) {
  for (; n; n >>= 1, a = a * a % mod)
    if (n & 1)
      c = c * a % mod;
  return c;
}

void init(int n) {
  int i;
  for (*fact = i = 1; i <= n; ++i)
    fact[i] = (ll)fact[i - 1] * i % mod;
  finv[n] = PowerMod(fact[n], mod - 2);
  for (i = n; i; --i)
    finv[i - 1] = (ll)finv[i] * i % mod;
}

inline ll iA(int n, int r) { return (ll)finv[n] * fact[n - r] % mod; }

namespace DP {
int B1[K];

inline void step(int *f) {
  int i, g = mod - f[R - 1];
  memcpy(B1, f, R << 2), *B1 = B1[1];
  for (i = R - 1; i; --i)
    f[i] = (B1[i - 1] * (R - i + 1ll) + g) % mod;
}

inline void init(int *f) {
  int i;
  f[R] = 0;
  for (i = R - 1; i; --i)
    add(f[i], f[i + 1]);
}

inline void trans(int len, int *f, int *g) {
  int i;
  *g = f[1];
  for (i = 1; i <= len; ++i)
    step(f), g[i] = f[1];
}
} // namespace DP

int main() {
  int i, j, l = 0, r = 0, x, kinds = 0, ans = 0, I;
  scanf("%d%d%d", &n, &R, &m), init(K);
  I = PowerMod(R, n - m, n - m + 1);
  for (i = 0; i < m + R; ++i) {
    if (i < m) {
      scanf("%d", a + i), kinds += !c[x = a[i]]++;
      if (c[x] == 2)
        l || (l = i);
    }
    if (i >= R) {
      kinds -= !--c[x = a[i - R]];
      if (c[x] == 1)
        r = m - (i - R) - 1;
    }
    if (kinds == R)
      return printf("%d\n", I), 0;
  }
  assert(R > 1), memset(c, 0, (R + 1) << 2);
  if (l) {
    assert(l < R && r < R);
    c[l] = 1, DP::init(c), DP::trans(n - m, c, f);
    d[r] = 1, DP::init(d), DP::trans(n - m, d, g);
    for (i = 0; i <= n - m; ++i)
      ans = (ans + (ll)f[i] * g[n - m - i]) % mod;
  } else {
    assert(m < R);
    c[1] = R, DP::init(c);
    d[1] = (m == 1 ? R : 0), DP::init(d);
    for (i = 1; i < n; ++i) {
      DP::step(c), DP::step(d);
      for (j = 0; j < m; ++j)
        add(d[j], c[m]);
      for (; j < R; ++j)
        add(d[j], c[j]);
    }
    ans = d[1] * iA(R, m) % mod;
  }
  ans = I - ans;
  printf("%d\n", ans + (ans >> 31 & mod));
  return 0;
}