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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
long long n,a,b,po[35],ans=1,fac=1,inv[200005];
int main(){
    scanf("%lld %lld %lld",&n,&a,&b);
    po[0]=2;
    for(int i=1;i<=30;i++)po[i]=(po[i-1]*po[i-1])%MOD;
    long long x=n;
    for(int i=0;i<=30;i++){
        if(x%2LL)ans=(ans*po[i])%MOD;
        x/=2LL;
        if(!x)break;
    }
    ans--;
    x=1;
    for(long long i=2;i<=200000;i++)fac=(fac*i)%MOD;
    po[0]=fac;
    for(int i=1;i<=30;i++)po[i]=(po[i-1]*po[i-1])%MOD;
    x=MOD-2LL;
    inv[200000]=1;
    for(int i=0;i<=30;i++){
        if(x%2LL)inv[200000]=(inv[200000]*po[i])%MOD;
        x/=2LL;
        if(!x)break;
    }
    for(long long i=199999;i>=0;i--)inv[i]=(inv[i+1]*(i+1))%MOD;
    long long mm=1;
    for(long long i=n;i>n-a;i--)mm=(mm*i)%MOD;
    mm=(mm*inv[a])%MOD;
    ans=(ans+MOD-mm)%MOD;
    mm=1;
    for(long long i=n;i>n-b;i--)mm=(mm*i)%MOD;
    mm=(mm*inv[b])%MOD;
    ans=(ans+MOD-mm)%MOD;
    printf("%lld",ans);
}