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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.*;

public class Main {

    static Scanner sc = new Scanner(System.in);

    static int MOD = (int)1e9+7;
    static int n = sc.nextInt();
    static int a = sc.nextInt();
    static int b = sc.nextInt();
//    static long[] facts = new long[n];

    public static void main(String[] args) {
//        facts = new long[n+1];
//        facts[0] = 1;

//        long[] comb = new long[n+2];
//        comb[0] = 1;

//        long comb = 1;

//        long comA = 0;
//        long comB = 0;


//        for (int i=1; i<=b; i++){
//            comb = ((comb*(n-i+1))/i)%MOD;
////            if (i==a) comA = comb;
//            if (i==a) comA = comb;
////            if (i==b) comB = comb;
//            if (i==b) comB = comb;
////            ans += comb%MOD;
////            ans %= MOD;
//
//        }

//        long comA = comb[a];
//        System.out.println(comA%MOD);

//        long comB = comb[b];
//        System.out.println(comB%MOD);
//        for (int i=1; i<n+1; i++){
//            facts[i] = facts[i-1]*i%MOD;
//        }
//        long comA = nck(n, a);
//        long comB = nck(n, b);

//        System.out.println(comA);
//        System.out.println(comB);

        long sum = modpow(2, n);
//        System.out.println(sum);

        long comA = nck(n, a);
        long comB = nck(n, b);

        long ans = sum-comA-comB-1+MOD*2;

        System.out.println(ans%MOD);

//        System.out.print(((ans)+MOD*2)%MOD);


    }

    public static long modpow(long a, long b){  // 計算量はlog(MOD);
        if (b==0) return 1;
        else if (b==1) return a;
        long x = modpow(a, b/2);
        return b%2==0 ? x*x%MOD : x*(x*a%MOD)%MOD;
    }
    public static long inv(long n){ // 逆元。x^(-1)≡x^(p-2) (MOD p)
        return modpow(n, MOD-2);
    }
    public static long nck(int n, int k){
        long res = 1;
        for (int i=0; i<k; i++){
            res = (res*(n-i))%MOD;
            res = (res*inv(i+1))%MOD;
        }
        return res;
    }

}