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# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABC156D
{
    class Program
    {
        static long ans = 1;
        static long mod = 1000000007;
        static void Main(string[] args)
        {
            string[] nab = Console.ReadLine().Split(' ');
            long n = long.Parse(nab[0]);
            long a = long.Parse(nab[1]);
            long b = long.Parse(nab[2]);

            string n2 = Convert.ToString(n, 2);
            int ln2 = n2.Length;
            long pow = 2;
            for(int i = ln2 - 1; i >= 0; i--)
            {
                if (n2[i].ToString() == "1")
                {
                    ans *= pow;
                    ans %= mod;
                }
                pow *= pow;
                pow %= mod;
            }
            ans += mod - 1;
            ans %= mod;

            long ansa = combination(n, a);
            long ansb = combination(n, b);

            ans += mod - ansa;
            ans %= mod;
            ans += mod - ansb;
            ans %= mod;
            
            Console.WriteLine(ans);
        }
        static long combination(long m,long n)
        {
            long bunbo = 1;
            for(long i = m; i > m-n; i--)
            {
                bunbo *= i;
                bunbo %= mod;
            }
            long bunsi = 1;
            for(long i = 1; i <= n; i++)
            {
                bunsi *= i;
                bunsi %= mod;
            }
            string p = Convert.ToString(mod - 2, 2);
            int l = p.Length;
            long gyakugen = 1;
            long pow = bunsi;
            for(int i = l - 1; i >= 0; i--)
            {
                if (p[i].ToString() == "1")
                {
                    gyakugen *= pow;
                    gyakugen %= mod;
                }
                pow *= pow;
                pow %= mod;
            }
            long temp = bunbo * gyakugen;
            temp %= mod;
            return temp;
        }
    }
}