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

use proconio::input;

fn main() {
    input! {
        n: isize,
        a: isize,
        b: isize,
    }

    let m = 1000000007;

    let mut ans = repeat_squaring(2, n, m) - 1;
    //println!("repeat {}", ans);
    ans = (ans + m - combination(n, a, m)) % m;
    //println!("comb1 {}", ans);
    ans = (ans + m - combination(n, b, m)) % m;
    //println!("comb2 {}", ans);


    println!("{}", ans%m);
}

fn repeat_squaring(n: isize, p: isize, m: isize) -> isize {
    if p == 0 {
        return 1;
    }
    if p%2 == 0 {
        let t = repeat_squaring(n, p/2, m);
        //println!("t: {}", t);
        return (t%m)*(t%m) % m;
    }
    n * repeat_squaring(n, p-1, m) % m
}

fn combination(n: isize, a: isize, m: isize) -> isize {
    let mut child = n;
    let mut mother = 1;

    for i in 1..a {
        child = child * (n-i) % m;
        mother = mother * (i+1) % m;
    }

    //println!("child {}", child);
    //println!("mother {}", mother);
    child * repeat_squaring(mother, m-2, m) % m

}