Number of ways to arrange K different objects taking N objects at a time
Given two integers K and N, the task is to count the number of ways to arrange K different objects taking N objects at a time. Each arrangement contains one object at most once. The answer can be very large so return the answer modulo 109 + 7.
Note: 1 <= N <= K <= 105.
Prerequisites: Factorial of a number, Compute nCr % p
Examples:
Input : N = 3, K = 3
Output : 6
If 1, 2 and 3 be the K different objects, then the possible arrangements are {123, 132, 213, 231, 312, 321}.
Input : N = 4, K = 6
Output : 360
Approach: The problem can be solved using Permutation and Combination. As N is always less than or equal to K, an answer greater than 0 shall always exist. Any object among the K available objects can be used at most once in an arrangement. So, we need to select N objects out of the K available objects for a single arrangement. So, the total number of ways to select N objects from K objects is KCN . Any selected group of N objects can then be permuted among themselves in N ways. So, the answer to the problem is:
(N! * KCN) % (109 +7)
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod (ll)(1e9 + 7)
ll factorial(ll n, ll p)
{
ll res = 1;
for ( int i = 2; i <= n; i++)
res = (res * i) % p;
return res;
}
ll power(ll x, ll y, ll p)
{
ll res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
ll modInverse(ll n, ll p)
{
return power(n, p - 2, p);
}
ll nCrModP(ll n, ll r, ll p)
{
if (r == 0)
return 1;
ll fac[n + 1];
fac[0] = 1;
for ( int i = 1; i <= n; i++)
fac[i] = fac[i - 1] * i % p;
return (fac[n] * modInverse(fac[r], p) % p
* modInverse(fac[n - r], p) % p) % p;
}
ll countArrangements(ll n, ll k, ll p)
{
return (factorial(n, p) * nCrModP(k, n, p)) % p;
}
int main()
{
ll N = 5, K = 8;
cout << countArrangements(N, K, mod);
return 0;
}
|
Java
class GFG
{
static long mod =( long ) (1e9 + 7 );
static long factorial( long n, long p)
{
long res = 1 ;
for ( int i = 2 ; i <= n; i++)
res = (res * i) % p;
return res;
}
static long power( long x, long y, long p)
{
long res = 1 ;
x = x % p;
while (y > 0 )
{
if ((y & 1 )== 1 )
res = (res * x) % p;
y = y >> 1 ;
x = (x * x) % p;
}
return res;
}
static long modInverse( long n, long p)
{
return power(n, p - 2 , p);
}
static long nCrModP( long n, long r, long p)
{
if (r == 0 )
return 1 ;
long fac[] = new long [( int )n + 1 ];
fac[ 0 ] = 1 ;
for ( int i = 1 ; i <= n; i++)
fac[i] = fac[i - 1 ] * i % p;
return (fac[( int )n] * modInverse(fac[( int )r], p) % p
* modInverse(fac[( int )n - ( int )r], p) % p) % p;
}
static long countArrangements( long n, long k, long p)
{
return (factorial(n, p) * nCrModP(k, n, p)) % p;
}
public static void main(String[] args)
{
long N = 5 , K = 8 ;
System.out.println(countArrangements(N, K, mod));
}
}
|
Python3
mod = 10 * * 9 + 7
def factorial(n, p):
res = 1
for i in range ( 2 , n + 1 ):
res = (res * i) % p
return res
def power(x, y, p):
res = 1
x = x % p
while (y > 0 ):
if (y & 1 ):
res = (res * x) % p
y = y >> 1
x = (x * x) % p
return res
def modInverse(n, p):
return power(n, p - 2 , p)
def nCrModP(n, r, p):
if (r = = 0 ):
return 1
fac = [ 0 for i in range (n + 1 )]
fac[ 0 ] = 1
for i in range ( 1 , n + 1 ):
fac[i] = fac[i - 1 ] * i % p
return (fac[n] * modInverse(fac[r], p) % p *
modInverse(fac[n - r], p) % p) % p
def countArrangements(n, k, p):
return (factorial(n, p) *
nCrModP(k, n, p)) % p
N = 5
K = 8
print (countArrangements(N, K, mod))
|
C#
using System;
class GFG
{
static long mod =( long ) (1e9 + 7);
static long factorial( long n, long p)
{
long res = 1;
for ( int i = 2; i <= n; i++)
res = (res * i) % p;
return res;
}
static long power( long x, long y, long p)
{
long res = 1;
x = x % p;
while (y > 0)
{
if ((y & 1)==1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
static long modInverse( long n, long p)
{
return power(n, p - 2, p);
}
static long nCrModP( long n, long r, long p)
{
if (r == 0)
return 1;
long [] fac = new long [( int )n + 1];
fac[0] = 1;
for ( int i = 1; i <= n; i++)
fac[i] = fac[i - 1] * i % p;
return (fac[( int )n] * modInverse(fac[( int )r], p) % p
* modInverse(fac[( int )n - ( int )r], p) % p) % p;
}
static long countArrangements( long n, long k, long p)
{
return (factorial(n, p) * nCrModP(k, n, p)) % p;
}
public static void Main()
{
long N = 5, K = 8;
Console.WriteLine(countArrangements(N, K, mod));
}
}
|
PHP
<?php
$mod = (1e9 + 7);
function factorial( $n , $p )
{
$res = 1;
for ( $i = 2; $i <= $n ; $i ++)
$res = ( $res * $i ) % $p ;
return $res ;
}
function power( $x , $y , $p )
{
$res = 1;
$x = $x % $p ;
while ( $y > 0)
{
if (( $y & 1)==1)
$res = ( $res * $x ) % $p ;
$y = $y >> 1;
$x = ( $x * $x ) % $p ;
}
return $res ;
}
function modInverse( $n , $p )
{
return power( $n , $p - 2, $p );
}
function nCrModP( $n , $r , $p )
{
if ( $r == 0)
return 1;
$fac = array ((int) $n + 1);
$fac [0] = 1;
for ( $i = 1; $i <= $n ; $i ++)
$fac [ $i ] = $fac [ $i - 1] * $i % $p ;
return ( $fac [(int) $n ] * modInverse( $fac [(int) $r ], $p ) % $p
* modInverse( $fac [(int) $n - (int) $r ], $p ) % $p ) % $p ;
}
function countArrangements( $n , $k , $p )
{
return (factorial( $n , $p ) * nCrModP( $k , $n , $p )) % $p ;
}
{
$N = 5; $K = 8;
echo (countArrangements( $N , $K , $mod ));
}
|
Javascript
<script>
var mod =parseInt(1e4 + 7);
function factorial(n , p)
{
var res = 1;
for ( var i = 2; i <= n; i++)
res = (res * i) % p;
return res;
}
function power(x , y , p)
{
var res = 1;
x = x % p;
while (y > 0)
{
if ((y & 1)==1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
function modInverse(n , p)
{
return power(n, p - 2, p);
}
function nCrModP(n , r , p)
{
if (r == 0)
return 1;
var fac = Array.from({length: n+1}, (_, i) => 0);;
fac[0] = 1;
for ( var i = 1; i <= n; i++)
fac[i] = fac[i - 1] * i % p;
return (fac[parseInt(n)] * modInverse(fac[parseInt(r)], p) % p
* modInverse(fac[parseInt(n) - parseInt(r)], p) % p) % p;
}
function countArrangements(n , k , p)
{
return (factorial(n, p) * nCrModP(k, n, p)) % p;
}
var N = 5, K = 8;
document.write(countArrangements(N, K, mod));
</script>
|
Time Complexity: O(n), to fill a factorial array
Auxiliary Space: O(n), extra space of size n used to make a factorial array
Last Updated :
31 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...