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.Collections.Generic;
using System.Linq;
using System.Text;

public class MainClass
{
	public const long Giri = 1000000007;
	public const long DpInf = 99999999999;
	
	private static long[] fac;
	private static long[] finv;
	private static long[] inv;
	
	public static void Main(string[] args)
	{
		var p = Input();
		var n = p[0].ToLong();
		var a = p[1].ToInt();
		var b = p[2].ToInt();
		
		long wa = ModPow(2, n, Giri) - 1;
		fac = new long[510000];
		finv = new long[510000];
		inv = new long[510000];
		
		long wa2 = 0;
		wa2 += COM2(n, (int)a);
		wa2 += COM2(n, (int)b);
		//wa2 += CombinationMod(n, a, Giri);
		//wa2 += CombinationMod(n, b, Giri);
		/*
		for(int i = 1; i <= n; i++)
		{
		}
		*/
		
		//Console.WriteLine(wa+" "+ wa2);
		Console.WriteLine(wa-wa2);
	}
	
	static long ComCalc(long a, long b, long p) {
    if (b == 0) {
        return 1;
    } else if (b % 2 == 0) {
        long d = ComCalc(a, b / 2, p);
        return (d * d) % p;
    } else {
        return (a * ComCalc(a, b - 1, p)) % p;
    }
}

	static long COM2(long n, long k)
	{
		long q = 1;
		long s = 1;
		long t = 1;
		for(long i = n; i >= 2; i--)
		{
			q *= i%Giri;
			q %= Giri;
		}
		
		for(long i = k; i >= 2; i--)
		{
			s *= ComCalc(i, Giri- 2, Giri)%Giri;
			s %= Giri;
		}

		for(long i = n - k; i >= 2; i--)
		{
			s *= ComCalc(i, Giri- 2, Giri)%Giri;
			s %= Giri;
		}
		return (long)(q * s) % Giri;
	}
	static void COMinit()
	{
		 fac[0] = fac[1] = 1;
	    finv[0] = finv[1] = 1;
	    inv[1] = 1;
	    for (int i = 2; i < 510000; i++){
	        fac[i] = fac[i - 1] * i % Giri;
	        inv[i] = Giri - inv[Giri%i] * (Giri / i) % Giri;
	        finv[i] = finv[i - 1] * inv[i] % Giri;
	    }
	}
	
	static long COM(int n, int k){
	    if (n < k) return 0;
	    if (n < 0 || k < 0) return 0;
	    return fac[n] * (finv[k] * finv[n - k] % Giri) % Giri;
	}

	
	static long ModPow(long a, long n, long mod) {
	    long res = 1;
	    while (n > 0) {
	        if ((n & 1) == 1) res = res * a % mod;
	        a = a * a % mod;
	        n >>= 1;
	    }
	    return res;
	}

	static long CombinationMod(long m, long n, long mod) {
    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;
    };
    Func<long, long> ModFact = (x1) => {
        long ans = 1;
        for (long i = x1; i > 0; i--)
            ans = (ans * i) % mod;
        return ans;
    };

    var a = ModFact(m);
    var b = (ModFact(n) * ModFact(m-n)) % mod;
    long bb = ModPow(b, mod - 2);
    return (a * bb) % mod;
}

	
	static long GCD(long a, long b)
	{
		var v = new[] { a, b };
		while (v[1] != 0) { v = new[] { v[1], v[0] % v[1] }; }
		return v[0];
	}
	public static string[] Input() { return Console.ReadLine().Split(); }
}

public static class Smarter
{
	public static int ToInt(this string str) { return int.Parse(str); }
	public static long ToLong(this string str) { return long.Parse(str); }
	public static int[] ToInt(this string[] str, int offset = 0)
	{
		var r = new int[str.Length];
		for(int i = 0; i < str.Length; i++) r[i] = str[i].ToInt() + offset;
		return r;
	 }
}