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 Java (OpenJDK 11.0.6) (judge verdict: Accepted)


import java.util.Scanner;

public class Main {

     static Scanner scanner;

     public static void main(String[] args) {
         scanner = new Scanner(System.in);

         long N=gl();
         long a=gl();
         long b=gl();
         long ans=modpow(2,N,1000000007)-1;
         long nca=1;
         long ncb=1;
         a=Math.min(a, N-a);
         b=Math.min(b, N-b);
         long now=N;
         while(now>N-a) {
        	 nca*=now;
        	 nca=nca%1000000007;
        	 now--;
         }

         now=a;
         while(now>0) {
        	 nca*=modpow(now, 1000000005, 1000000007);
        	 nca=nca%1000000007;
        	 now--;
         }

         now=N;
         while(now>N-b) {
        	 ncb*=now;
        	 ncb=ncb%1000000007;
        	 now--;
         }

         now=b;
         while(now>0) {
        	 ncb*=modpow(now, 1000000005, 1000000007);
        	 ncb=ncb%1000000007;
        	 now--;
         }
         ans=(ans+2*1000000007-nca-ncb)%1000000007;

         System.out.println(ans);
     }

  // a^nをmodで割ったあまり
 	public 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=n>>1;
 		}

 		return res;
 	}

     public static long f(long n) {
    	 if(n==1)return 1;
    	 return 2*f(n>>1);
     }

     // 文字列として入力を取得
     public static String gs() {
          return scanner.next();
     }

     // intとして入力を取得
     public static int gi() {
          return Integer.parseInt(scanner.next());
     }

     // longとして入力を取得
     public static long gl() {
          return Long.parseLong(scanner.next());
     }

     // doubleとして入力を取得
     public static double gd() {
          return Double.parseDouble(scanner.next());
     }
}