Problem p03820 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)x.size())
#define L(i, u) for (register int i = head[u]; i; i = nxt[i])
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)
#define per(i, a, b) for (register int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int, int> Pii;
typedef vector<int> Vi;
template <class T> inline void read(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  x *= f;
}
template <class T> inline void umin(T &x, T y) { x = x < y ? x : y; }
template <class T> inline void umax(T &x, T y) { x = x > y ? x : y; }
inline ui R() {
  static ui seed = 416;
  return seed ^= seed >> 5, seed ^= seed << 17, seed ^= seed >> 13;
}
const int N = 233333, mo = 1e9 + 7;
int n, k, fac[N], ifac[N], res;
inline int power(int a, int n) {
  int res = 1;
  while (n) {
    if (n & 1)
      res = 1LL * res * a % mo;
    a = 1LL * a * a % mo;
    n >>= 1;
  }
  return res;
}
inline void iniC(int n) {
  fac[0] = 1;
  rep(i, 1, n) fac[i] = 1LL * fac[i - 1] * i % mo;
  ifac[n] = power(fac[n], mo - 2);
  per(i, n - 1, 0) ifac[i] = 1LL * ifac[i + 1] * (i + 1) % mo;
}
inline int C(int n, int m) {
  return m >= 0 && m <= n ? 1LL * fac[n] * ifac[m] % mo * ifac[n - m] % mo : 0;
}
int main() {
  read(n);
  read(k);
  iniC(2 * n);
  if (k == 1)
    res = 1;
  else if (k == n)
    res = (C(2 * (k - 1) - 1, k - 1) - C(2 * (k - 1) - 1, k) + mo) % mo;
  else {
    res = ((1LL * C(n + k - 2, n - 1) - C(n + k - 2, n) - C(2 * k - 2, k - 1) +
            C(2 * k - 2, k) + C(2 * k - 3, k - 1) - C(2 * k - 3, k)) %
               mo +
           mo) %
          mo;
  }
  res = 1LL * res * power(2, n - k - 1) % mo;
  cout << res;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)x.size())
#define L(i, u) for (register int i = head[u]; i; i = nxt[i])
#define rep(i, a, b) for (register int i = (a); i <= (b); i++)
#define per(i, a, b) for (register int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int, int> Pii;
typedef vector<int> Vi;
template <class T> inline void read(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  x *= f;
}
template <class T> inline void umin(T &x, T y) { x = x < y ? x : y; }
template <class T> inline void umax(T &x, T y) { x = x > y ? x : y; }
inline ui R() {
  static ui seed = 416;
  return seed ^= seed >> 5, seed ^= seed << 17, seed ^= seed >> 13;
}
const int N = 233333, mo = 1e9 + 7;
int n, k, fac[N], ifac[N], res;
inline int power(int a, int n) {
  int res = 1;
  while (n) {
    if (n & 1)
      res = 1LL * res * a % mo;
    a = 1LL * a * a % mo;
    n >>= 1;
  }
  return res;
}
inline void iniC(int n) {
  fac[0] = 1;
  rep(i, 1, n) fac[i] = 1LL * fac[i - 1] * i % mo;
  ifac[n] = power(fac[n], mo - 2);
  per(i, n - 1, 0) ifac[i] = 1LL * ifac[i + 1] * (i + 1) % mo;
}
inline int C(int n, int m) {
  return m >= 0 && m <= n ? 1LL * fac[n] * ifac[m] % mo * ifac[n - m] % mo : 0;
}
int main() {
  read(n);
  read(k);
  iniC(2 * n);
  if (k == 1)
    res = 1;
  else if (k == n)
    res = (C(2 * (k - 1) - 1, k - 1) - C(2 * (k - 1) - 1, k) + mo) % mo;
  else {
    res = ((1LL * C(n + k - 2, n - 1) - C(n + k - 2, n) - C(2 * k - 2, k - 1) +
            C(2 * k - 2, k) + C(2 * k - 3, k - 1) - C(2 * k - 3, k)) %
               mo +
           mo) %
          mo;
  }
  if (n - k - 1 >= 0)
    res = 1LL * res * power(2, n - k - 1) % mo;
  cout << res;
  return 0;
}