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# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args) {
#if DEBUG
        MyDebugger.Test(process, "../TextFile1.txt");
        //MyDebugger.Test(process, "../TextFile2.txt");
        //MyDebugger.MakeTestCase("../TextFile2.txt");
#else
        object ret = process(new StreamReader(Console.OpenStandardInput()));
        Console.WriteLine(ret);
#endif
    }

    static long mod = 1000000007;

    static object process(TextReader input) {
        var spl   = input.ReadLine().Split(' ');
        var n     = int.Parse(spl[0]);
        var a     = int.Parse(spl[1]);
        var b     = int.Parse(spl[2]);

        var y = Calc2(n);

        y -= CombinationMod(n, a);
        if (y < 0) y += mod;
        y -= CombinationMod(n, b);
        if (y < 0) y += mod;

        return y % mod;
    }

    static long Calc2(long n) {
        if (n == 0) return 0;

        long x = 1;
        long y = 1;//Calc(x);

        if (n > 1) {
            var v = ModPow(2, n - 1);
            y = y * ModPow(2, n - 1) + v-1;
            y %= mod;
        }
        return y;
    }

    //static long Calc(int n) {
    //    long c = 0;
    //    for(int i=1; i<=n; i++) {
    //        //if (i == a || i == b) continue;
    //        var co = CombinationMod(n, i);
    //        c += co;
    //        c %= mod;
    //    }
    //    return c;
    //}

    static long CombinationMod(long m, long n) {
        Func<long, long, long> ModPow = (x1, x2) => {
            long ans = 1;
            while (x2 > 0) {
                if (x2 % 2 == 1) {
                    ans = (ans * x1) % mod;
                }
                x1 = (x1 * x1) % mod;
                x2 /= 2;
            }
            return ans % mod;
        };

        var a = ModFact(m);
        var b = (ModFact(n) * ModFact(m-n)) % mod;
        long bb = ModPow(b, mod - 2);
        return (a * bb) % mod;
    }
    static long ModFact(long x1) {
        long ans = 1;
        for (long i = x1; i > 0; i--)
            ans = (ans * i) % mod;
        return ans;
    }    
    static long ModPow(long x1, long x2) {
        long ans = 1;
        while (x2 > 0) {
            if (x2 % 2 == 1) {
                ans = (ans * x1) % mod;
            }
            x1 = (x1 * x1) % mod;
            x2 /= 2;
        }
        return ans % mod;
    }
}