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 9.2.1) (judge verdict: Accepted)

#include<stdio.h>
#include<string.h>

#define MAX_NUM(v, w) ((v) > (w) ? (v) : (w))

long long int pow_mod(long long int x, long long int y, long long int m)
{
	long long int mod, next_mod;

	if (y == 0)
	{
		return 1;
	}
	else if ((y % 2) == 0) {
		next_mod = pow_mod(x, (y / 2), m);
		mod = (next_mod*next_mod) % m;
	}
	else {
		next_mod = pow_mod(x, ((y - 1) / 2), m);
		mod = (next_mod*next_mod) % m;
		mod = (mod*x) % m;
	}

	return mod;
}

int main()
{
	long long int n, answer = 1, d = 1;
	long long int a, b;
	long long int n_step = 1, n_step_reverse = 1, a_step, n_a_step, b_step, n_b_step, n_c_a, n_c_b;

	for (int i = 0; i<9; i++)
	{
		d *= 10;
	}

	d += 7;

	scanf("%lld %lld %lld", &n, &a, &b);

	answer = pow_mod(2, n, d);

	for (long long int i = 0; i<MAX_NUM(a, b); i++)
	{

		n_step *= (i + 1);
		n_step_reverse *= (n - i);

		if (n_step >d)
		{
			n_step %= d;
		}

		if (n_step_reverse > d)
		{
			n_step_reverse %= d;
		}

		if ((i + 1) == a)
		{
			a_step = n_step;
			n_a_step = n_step_reverse;
		}

		if ((i + 1) == b) {
			b_step = n_step;
			n_b_step = n_step_reverse;
		}

	}

	n_c_a = n_a_step;
	n_c_b = n_b_step;

	n_c_a *= pow_mod(a_step, (d - 2), d);
	n_c_b *= pow_mod(b_step, (d - 2), d);

	n_c_a %= d;
	n_c_b %= d;

	answer += 2 * d;

	answer = answer - n_c_a - n_c_b;

	answer += -1;

	answer %= d;

	printf("%lld", answer);

	return 0;
}