Rencontres Number (Counting partial derangements)
Given two numbers, n >= 0 and 0 <= k <= n, count the number of derangements with k fixed points.
Examples:
Input : n = 3, k = 0
Output : 2
Since k = 0, no point needs to be on its
original position. So derangements
are {3, 1, 2} and {2, 3, 1}
Input : n = 3, k = 1
Output : 3
Since k = 1, one point needs to be on its
original position. So partial derangements
are {1, 3, 2}, {3, 2, 1} and {2, 1, 3}
Input : n = 7, k = 2
Output : 924
In combinatorial mathematics, the rencontres number< or D(n, k) represents count of partial derangements.
The recurrence relation to find Rencontres Number Dn, k:
D(0, 0) = 1
D(0, 1) = 0
D(n+2, 0) = (n+1) * (D(n+1, 0) + D(n, 0))
D(n, k) = nCk * D(n-k, 0))
Given the two positive integer n and k. The task is find rencontres number D(n, k) for giver n and k.
Below is Recursive solution of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
int binomialCoeff( int n, int k)
{
if (k == 0 || k == n)
return 1;
return binomialCoeff(n - 1, k - 1) +
binomialCoeff(n - 1, k);
}
int RencontresNumber( int n, int m)
{
if (n == 0 && m == 0)
return 1;
if (n == 1 && m == 0)
return 0;
if (m == 0)
return (n - 1) * (RencontresNumber(n - 1, 0) +
RencontresNumber(n - 2, 0));
return binomialCoeff(n, m) * RencontresNumber(n - m, 0);
}
int main()
{
int n = 7, m = 2;
cout << RencontresNumber(n, m) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int binomialCoeff( int n, int k)
{
if (k == 0 || k == n)
return 1 ;
return binomialCoeff(n - 1 , k - 1 ) +
binomialCoeff(n - 1 , k);
}
static int RencontresNumber( int n, int m)
{
if (n == 0 && m == 0 )
return 1 ;
if (n == 1 && m == 0 )
return 0 ;
if (m == 0 )
return (n - 1 ) * (RencontresNumber(n - 1 , 0 )
+ RencontresNumber(n - 2 , 0 ));
return binomialCoeff(n, m) *
RencontresNumber(n - m, 0 );
}
public static void main(String[] args)
{
int n = 7 , m = 2 ;
System.out.println(RencontresNumber(n, m));
}
}
|
Python3
def binomialCoeff(n, k):
if (k = = 0 or k = = n):
return 1
return (binomialCoeff(n - 1 , k - 1 )
+ binomialCoeff(n - 1 , k))
def RencontresNumber(n, m):
if (n = = 0 and m = = 0 ):
return 1
if (n = = 1 and m = = 0 ):
return 0
if (m = = 0 ):
return ((n - 1 ) * (RencontresNumber(n - 1 , 0 )
+ RencontresNumber(n - 2 , 0 )))
return (binomialCoeff(n, m) *
RencontresNumber(n - m, 0 ))
n = 7 ; m = 2
print (RencontresNumber(n, m))
|
C#
using System;
class GFG {
static int binomialCoeff( int n, int k)
{
if (k == 0 || k == n)
return 1;
return binomialCoeff(n - 1, k - 1) +
binomialCoeff(n - 1, k);
}
static int RencontresNumber( int n, int m)
{
if (n == 0 && m == 0)
return 1;
if (n == 1 && m == 0)
return 0;
if (m == 0)
return (n - 1) *
(RencontresNumber(n - 1, 0)
+ RencontresNumber(n - 2, 0));
return binomialCoeff(n, m) *
RencontresNumber(n - m, 0);
}
public static void Main()
{
int n = 7, m = 2;
Console.Write(RencontresNumber(n, m));
}
}
|
PHP
<?php
function binomialCoeff( $n , $k )
{
if ( $k == 0 || $k == $n )
return 1;
return binomialCoeff( $n - 1, $k - 1) +
binomialCoeff( $n - 1, $k );
}
function RencontresNumber( $n , $m )
{
if ( $n == 0 && $m == 0)
return 1;
if ( $n == 1 && $m == 0)
return 0;
if ( $m == 0)
return ( $n - 1) * (RencontresNumber( $n - 1, 0) +
RencontresNumber( $n - 2, 0));
return binomialCoeff( $n , $m ) *
RencontresNumber( $n - $m , 0);
}
$n = 7;
$m = 2;
echo RencontresNumber( $n , $m ), "\n" ;
?>
|
Javascript
<script>
function binomialCoeff(n, k)
{
if (k == 0 || k == n)
return 1;
return binomialCoeff(n - 1,k - 1) +
binomialCoeff(n - 1, k);
}
function RencontresNumber(n, m)
{
if (n == 0 && m == 0)
return 1;
if (n == 1 && m == 0)
return 0;
if (m == 0)
return (n - 1) * (RencontresNumber(n - 1, 0) +
RencontresNumber(n - 2, 0));
return binomialCoeff(n, m) *
RencontresNumber(n - m, 0);
}
let n = 7;
let m = 2;
document.write(RencontresNumber(n, m) + "<br>" );
</script>
|
Time Complexity: O(n * m), where n and m represents the given integers.
Auxiliary Space: O(n*m), due to recursive stack space.
Below is the implementation using Dynamic Programming:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 100
int binomialCoeff( int C[][MAX], int n, int k)
{
for ( int i = 0; i <= n; i++) {
for ( int j = 0; j <= min(i, k); j++) {
if (j == 0 || j == i)
C[i][j] = 1;
else
C[i][j] = C[i - 1][j - 1] +
C[i - 1][j];
}
}
}
int RencontresNumber( int C[][MAX], int n, int m)
{
int dp[n+1][m+1] = { 0 };
for ( int i = 0; i <= n; i++) {
for ( int j = 0; j <= m; j++) {
if (j <= i) {
if (i == 0 && j == 0)
dp[i][j] = 1;
else if (i == 1 && j == 0)
dp[i][j] = 0;
else if (j == 0)
dp[i][j] = (i - 1) * (dp[i - 1][0] +
dp[i - 2][0]);
else
dp[i][j] = C[i][j] * dp[i - j][0];
}
}
}
return dp[n][m];
}
int main()
{
int n = 7, m = 2;
int C[MAX][MAX];
binomialCoeff(C, n, m);
cout << RencontresNumber(C, n, m) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int MAX = 100 ;
static void binomialCoeff( int C[][], int n, int k)
{
for ( int i = 0 ; i <= n; i++) {
for ( int j = 0 ; j <= Math.min(i, k); j++)
{
if (j == 0 || j == i)
C[i][j] = 1 ;
else
C[i][j] = C[i - 1 ][j - 1 ] +
C[i - 1 ][j];
}
}
}
static int RencontresNumber( int C[][], int n, int m)
{
int dp[][] = new int [n + 1 ][m + 1 ];
for ( int i = 0 ; i <= n; i++) {
for ( int j = 0 ; j <= m; j++) {
if (j <= i) {
if (i == 0 && j == 0 )
dp[i][j] = 1 ;
else if (i == 1 && j == 0 )
dp[i][j] = 0 ;
else if (j == 0 )
dp[i][j] = (i - 1 ) * (dp[i - 1 ][ 0 ]
+ dp[i - 2 ][ 0 ]);
else
dp[i][j] = C[i][j] * dp[i - j][ 0 ];
}
}
}
return dp[n][m];
}
public static void main(String[] args)
{
int n = 7 , m = 2 ;
int C[][] = new int [MAX][MAX];
binomialCoeff(C, n, m);
System.out.println(RencontresNumber(C, n, m));
}
}
|
Python 3
MAX = 100
def binomialCoeff(C, n, k) :
for i in range ( 0 , n + 1 ) :
for j in range ( 0 , min (i, k) + 1 ) :
if (j = = 0 or j = = i) :
C[i][j] = 1
else :
C[i][j] = (C[i - 1 ][j - 1 ]
+ C[i - 1 ][j])
def RencontresNumber(C, n, m) :
w, h = m + 1 , n + 1
dp = [[ 0 for x in range (w)] for y in range (h)]
for i in range ( 0 , n + 1 ) :
for j in range ( 0 , m + 1 ) :
if (j < = i) :
if (i = = 0 and j = = 0 ) :
dp[i][j] = 1
elif (i = = 1 and j = = 0 ) :
dp[i][j] = 0
elif (j = = 0 ) :
dp[i][j] = ((i - 1 ) *
(dp[i - 1 ][ 0 ] + dp[i - 2 ][ 0 ]))
else :
dp[i][j] = C[i][j] * dp[i - j][ 0 ]
return dp[n][m]
n = 7
m = 2
C = [[ 0 for x in range ( MAX )] for y in range ( MAX )]
binomialCoeff(C, n, m)
print (RencontresNumber(C, n, m))
|
C#
using System;
class GFG
{
static int MAX = 100;
static void binomialCoeff( int [,]C,
int n, int k)
{
for ( int i = 0; i <= n; i++)
{
for ( int j = 0;
j <= Math.Min(i, k); j++)
{
if (j == 0 || j == i)
C[i,j] = 1;
else
C[i, j] = C[i - 1, j - 1] +
C[i - 1, j];
}
}
}
static int RencontresNumber( int [,]C,
int n, int m)
{
int [,]dp = new int [n + 1,
m + 1];
for ( int i = 0; i <= n; i++)
{
for ( int j = 0; j <= m; j++)
{
if (j <= i)
{
if (i == 0 && j == 0)
dp[i, j] = 1;
else if (i == 1 && j == 0)
dp[i, j] = 0;
else if (j == 0)
dp[i, j] = (i - 1) *
(dp[i - 1, 0] +
dp[i - 2, 0]);
else
dp[i, j] = C[i, j] *
dp[i - j, 0];
}
}
}
return dp[n, m];
}
static public void Main ()
{
int n = 7, m = 2;
int [,]C = new int [MAX, MAX];
binomialCoeff(C, n, m);
Console.WriteLine(RencontresNumber(C, n, m));
}
}
|
PHP
<?php
$MAX =100;
function binomialCoeff(& $C , $n , $k )
{
for ( $i = 0; $i <= $n ; $i ++) {
for ( $j = 0; $j <= min( $i , $k ); $j ++) {
if ( $j == 0 || $j == $i )
$C [ $i ][ $j ] = 1;
else
$C [ $i ][ $j ] = $C [ $i - 1][ $j - 1] +
$C [ $i - 1][ $j ];
}
}
}
function RencontresNumber( $C , $n , $m )
{
$dp = array_fill (0, $n +1, array_fill (0, $m +1,0));
for ( $i = 0; $i <= $n ; $i ++) {
for ( $j = 0; $j <= $m ; $j ++) {
if ( $j <= $i ) {
if ( $i == 0 && $j == 0)
$dp [ $i ][ $j ] = 1;
else if ( $i == 1 && $j == 0)
$dp [ $i ][ $j ] = 0;
else if ( $j == 0)
$dp [ $i ][ $j ] = ( $i - 1) * ( $dp [ $i - 1][0] +
$dp [ $i - 2][0]);
else
$dp [ $i ][ $j ] = $C [ $i ][ $j ] * $dp [ $i - $j ][0];
}
}
}
return $dp [ $n ][ $m ];
}
$n = 7;
$m = 2;
$C = array ( array ());
binomialCoeff( $C , $n , $m );
echo RencontresNumber( $C , $n , $m );
?>
|
Javascript
<script>
const MAX = 100
function binomialCoeff(C, n, k){
for (let i=0;i<n+1;i++){
for (let j=0;j< Math.min(i, k) + 1;j++){
if (j == 0 || j == i)
C[i][j] = 1
else
C[i][j] = (C[i - 1][j - 1]
+ C[i - 1][j])
}
}
}
function RencontresNumber(C, n, m){
let w = m+1,h = n+1
let dp= new Array(h).fill(0).map(()=> new Array(w).fill(0))
for (let i=0;i<n+1;i++){
for (let j=0;j<m+1;j++){
if (j <= i) {
if (i == 0 && j == 0)
dp[i][j] = 1
else if (i == 1 && j == 0)
dp[i][j] = 0
else if (j == 0){
dp[i][j] = ((i - 1) *
(dp[i - 1][0] + dp[i - 2][0]))
}
else
dp[i][j] = C[i][j] * dp[i - j][0]
}
}
}
return dp[n][m]
}
let n = 7
let m = 2
let C = new Array(MAX).fill(0).map(()=> new Array(MAX).fill(0))
binomialCoeff(C, n, m)
document.write(RencontresNumber(C, n, m), "</br>" )
</script>
|
Time Complexity: O(n * m), where n and m represents the given integers.
Auxiliary Space: O(n * m), where n and m represents the given integers.
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...