Problem:
Score : 400 points

Problem Statement

Akari has n kinds of flowers, one of each kind.

She is going to choose one or more of these flowers to make a bouquet.

However, she hates two numbers a and b, so the number of flowers in the bouquet cannot be a or b.

How many different bouquets are there that Akari can make?

Find the count modulo (10^9 + 7).

Here, two bouquets are considered different when there is a flower that is used in one of the bouquets but not in the other bouquet.

Constraints

All values in input are integers.

2 \leq n \leq 10^9

1 \leq a < b \leq \textrm{min}(n, 2 \times 10^5)

Input

Input is given from Standard Input in the following format:

n a b

Output

Print the number of bouquets that Akari can make, modulo (10^9 + 7). (If there are no such bouquets, print 0.)

Sample Input 1

4 1 3

Sample Output 1

7

In this case, Akari can choose 2 or 4 flowers to make the bouquet.

There are 6 ways to choose 2 out of the 4 flowers, and 1 way to choose 4, so there are a total of 7 different bouquets that Akari can make.

Sample Input 2

1000000000 141421 173205

Sample Output 2

34076506

Print the count modulo (10^9 + 7).

Solution in C (GCC 5.4.1) (judge verdict: Runtime Error)

#include <stdio.h>

const int MAX = 200000;
const int MOD = 1000000007;

// テーブルを作る前処理
void COMinit(long long fac[MAX], long long finv[MAX], long long inv[MAX]) {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

// 二項係数計算
long long COM(int n, int k, long long fac[MAX], long long finv[MAX], long long inv[MAX]){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}

int	main(void)
{
    long long fac[MAX], finv[MAX], inv[MAX];

  	long long	n;
  	long long	a;
  	long long	b;
  	int num;
  	long long	i;
  	long long	ans;
  
  	num = scanf("%lld %lld %lld", &n, &a, &b);
	if (num != 3)
      	return (0);
  
  	COMinit(fac, finv, inv);
  	ans = 0;
  	for (i = 0; i < a; i++)
    {
      	ans += COM(n, i, fac, finv, inv);
  		ans = ans % MOD;
    }
  	for (i = a + 1; i < b; i++)
    {
      	ans += COM(n, i, fac, finv, inv);
      	ans = ans % MOD;
    }
  	for (i = b + 1; i < MAX; i++)
    {
      	ans += COM(n, i, fac, finv, inv);
      	ans = ans % MOD;
    }
  	printf("%lld", ans);
  	return (0);
}