Given three numbers N, A, B. The task is to count the number of ways to select things such that there exists no set of size either A or B. Answer can be very large. So, output answer modulo 109+7. Note: Empty set is not consider as one of the way. Examples:
Input: N = 4, A = 1, B = 3 Output: 7 Explanation: The number of ways to form sets of size 2 are 6 (4C2). The number of ways to form sets of size 4 are 1 (4C4). Input: N = 10, A = 4, B = 9 Output: 803
Approach: The idea is to first find the number of ways including sets of size including A, B and empty sets. Then the remove the number of the sets of size A, B and empty sets. Below is the implementation of the above approach:
CPP
// C++ program to find number of sets without size A and B #include <bits/stdc++.h> using namespace std; #define mod (int)(1e9 + 7) // Function to find a^m1 int power( int a, int m1) { if (m1 == 0) return 1; else if (m1 == 1) return a; else if (m1 == 2) return (1LL * a * a) % mod; // If m1 is odd, then return a * a^m1/2 * a^m1/2 else if (m1 & 1) return (1LL * a * power(power(a, m1 / 2), 2)) % mod; else return power(power(a, m1 / 2), 2) % mod; } // Function to find factorial of a number int factorial( int x) { int ans = 1; for ( int i = 1; i <= x; i++) ans = (1LL * ans * i) % mod; return ans; } // Function to find inverse of x int inverse( int x) { return power(x, mod - 2); } // Function to find nCr int binomial( int n, int r) { if (r > n) return 0; int ans = factorial(n); ans = (1LL * ans * inverse(factorial(r))) % mod; ans = (1LL * ans * inverse(factorial(n - r))) % mod; return ans; } // Function to find number of sets without size a and b int number_of_sets( int n, int a, int b) { // First calculate all sets int ans = power(2, n); // Remove sets of size a ans = ans - binomial(n, a); if (ans < 0) ans += mod; // Remove sets of size b ans = ans - binomial(n, b); // Remove empty set ans--; if (ans < 0) ans += mod; // Return the required answer return ans; } // Driver code int main() { int N = 4, A = 1, B = 3; // Function call cout << number_of_sets(N, A, B); return 0; } |
Java
// Java program to find number of sets without size A and B import java.util.*; class GFG{ static final int mod =( int )(1e9 + 7 ); // Function to find a^m1 static int power( int a, int m1) { if (m1 == 0 ) return 1 ; else if (m1 == 1 ) return a; else if (m1 == 2 ) return ( int ) ((1L * a * a) % mod); // If m1 is odd, then return a * a^m1/2 * a^m1/2 else if (m1 % 2 == 1 ) return ( int ) ((1L * a * power(power(a, m1 / 2 ), 2 )) % mod); else return power(power(a, m1 / 2 ), 2 ) % mod; } // Function to find factorial of a number static int factorial( int x) { int ans = 1 ; for ( int i = 1 ; i <= x; i++) ans = ( int ) ((1L * ans * i) % mod); return ans; } // Function to find inverse of x static int inverse( int x) { return power(x, mod - 2 ); } // Function to find nCr static int binomial( int n, int r) { if (r > n) return 0 ; int ans = factorial(n); ans = ( int ) ((1L * ans * inverse(factorial(r))) % mod); ans = ( int ) ((1L * ans * inverse(factorial(n - r))) % mod); return ans; } // Function to find number of sets without size a and b static int number_of_sets( int n, int a, int b) { // First calculate all sets int ans = power( 2 , n); // Remove sets of size a ans = ans - binomial(n, a); if (ans < 0 ) ans += mod; // Remove sets of size b ans = ans - binomial(n, b); // Remove empty set ans--; if (ans < 0 ) ans += mod; // Return the required answer return ans; } // Driver code public static void main(String[] args) { int N = 4 , A = 1 , B = 3 ; // Function call System.out.print(number_of_sets(N, A, B)); } } // This code contributed by sapnasingh4991 |
Python3
# Python3 program to find number of # sets without size A and B mod = 10 * * 9 + 7 # Function to find a^m1 def power(a, m1): if (m1 = = 0 ): return 1 elif (m1 = = 1 ): return a elif (m1 = = 2 ): return (a * a) % mod # If m1 is odd, then return a * a^m1/2 * a^m1/2 elif (m1 & 1 ): return (a * power(power(a, m1 / / 2 ), 2 )) % mod else : return power(power(a, m1 / / 2 ), 2 ) % mod # Function to find factorial of a number def factorial(x): ans = 1 for i in range ( 1 , x + 1 ): ans = (ans * i) % mod return ans # Function to find inverse of x def inverse(x): return power(x, mod - 2 ) # Function to find nCr def binomial(n, r): if (r > n): return 0 ans = factorial(n) ans = (ans * inverse(factorial(r))) % mod ans = (ans * inverse(factorial(n - r))) % mod return ans # Function to find number of sets without size a and b def number_of_sets(n, a, b): # First calculate all sets ans = power( 2 , n) # Remove sets of size a ans = ans - binomial(n, a) if (ans < 0 ): ans + = mod # Remove sets of size b ans = ans - binomial(n, b) # Remove empty set ans - = 1 if (ans < 0 ): ans + = mod # Return the required answer return ans # Driver code if __name__ = = '__main__' : N = 4 A = 1 B = 3 # Function call print (number_of_sets(N, A, B)) # This code is contributed by mohit kumar 29 |
C#
// C# program to find number of sets without size A and B using System; class GFG{ static readonly int mod =( int )(1e9 + 7); // Function to find a^m1 static int power( int a, int m1) { if (m1 == 0) return 1; else if (m1 == 1) return a; else if (m1 == 2) return ( int ) ((1L * a * a) % mod); // If m1 is odd, then return a * a^m1/2 * a^m1/2 else if (m1 % 2 == 1) return ( int ) ((1L * a * power(power(a, m1 / 2), 2)) % mod); else return power(power(a, m1 / 2), 2) % mod; } // Function to find factorial of a number static int factorial( int x) { int ans = 1; for ( int i = 1; i <= x; i++) ans = ( int ) ((1L * ans * i) % mod); return ans; } // Function to find inverse of x static int inverse( int x) { return power(x, mod - 2); } // Function to find nCr static int binomial( int n, int r) { if (r > n) return 0; int ans = factorial(n); ans = ( int ) ((1L * ans * inverse(factorial(r))) % mod); ans = ( int ) ((1L * ans * inverse(factorial(n - r))) % mod); return ans; } // Function to find number of sets without size a and b static int number_of_sets( int n, int a, int b) { // First calculate all sets int ans = power(2, n); // Remove sets of size a ans = ans - binomial(n, a); if (ans < 0) ans += mod; // Remove sets of size b ans = ans - binomial(n, b); // Remove empty set ans--; if (ans < 0) ans += mod; // Return the required answer return ans; } // Driver code public static void Main(String[] args) { int N = 4, A = 1, B = 3; // Function call Console.Write(number_of_sets(N, A, B)); } } // This code is contributed by PrinciRaj1992 |
Javascript
const mod = 1e9 + 7; // Function to find a^m1 function power(a, m1) { if (m1 === 0) return 1; else if (m1 === 1) return a; else if (m1 === 2) return (a * a) % mod; // If m1 is odd, then return a * a^m1/2 * a^m1/2 else if (m1 % 2 === 1) return (a * power(power(a, Math.floor(m1 / 2)), 2)) % mod; else return power(power(a, Math.floor(m1 / 2)), 2) % mod; } // Function to find factorial of a number function factorial(x) { let ans = 1; for (let i = 1; i <= x; i++) ans = (ans * i) % mod; return ans; } // Function to find inverse of x function inverse(x) { return power(x, mod - 2); } // Function to find nCr function binomial(n, r) { if (r > n) return 0; let ans = factorial(n); ans = (ans * inverse(factorial(r))) % mod; ans = (ans * inverse(factorial(n - r))) % mod; return ans; } // Function to find number of sets without size a and b function number_of_sets(n, a, b) { // First calculate all sets let ans = power(2, n); // Remove sets of size a ans = ans - binomial(n, a); if (ans < 0) ans = (ans + mod) % mod; // Remove sets of size b ans = ans - binomial(n, b); // Remove empty set ans--; if (ans < 0) ans = (ans + mod) % mod; // Return the required answer return ans; } // Example usage const N = 4, A = 1, B = 3; console.log(number_of_sets(N, A, B)); // This code is contributed by anskalyan3. |
7
Time complexity: O(nlogn) because using a for loop and power function
Auxiliary Space: O(logn)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!