Given two integers X and Y. The task is to find the number of ways to reach (X, Y) in a matrix starting from the origin when the possible moves are from (i, j) to either (i + 1, j + 2) or (i + 2, j + 1). Rows are numbered from top to bottom and columns are numbered from left to right. The answer could be large, so print the answer modulo 109 + 7
Examples:
Input: X = 3, Y = 3
Output: 2
The only possible ways are (0, 0) -> (1, 2) -> (3, 3)
and (0, 0) -> (2, 1) -> (3, 3)Input: X = 2, Y = 3
Output: 0
Approach: The value of x coordinate + y coordinate increases by 3 with one movement. So when X + Y is not a multiple of 3, the answer is 0. When the number of movements of (+1, +2) is n and the number of movements of (+2, +1) is m then n + 2m = X, 2n + m = Y. The answer is 0 when n < 0 or m < 0. If not, the answer is n + m C n because it is only necessary to decide which n + 1 of the total n + m moves (+ 1, + 2). This value can be calculated by O(n + m + log mod) by calculating the factorial and its inverse. It can also be calculated with O(min {n, m}).
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
#define N 1000005 #define mod (int)(1e9 + 7) // To store the factorial and factorial // mod inverse of the numbers int factorial[N], modinverse[N];
// Function to find (a ^ m1) % mod 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;
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 the factorial // of all the numbers void factorialfun()
{ factorial[0] = 1;
for ( int i = 1; i < N; i++)
factorial[i] = (1LL * factorial[i - 1] * i) % mod;
} // Function to find the factorial // modinverse of all the numbers void modinversefun()
{ modinverse[N - 1] = power(factorial[N - 1], mod - 2) % mod;
for ( int i = N - 2; i >= 0; i--)
modinverse[i] = (1LL * modinverse[i + 1] * (i + 1)) % mod;
} // Function to return nCr int binomial( int n, int r)
{ if (r > n)
return 0;
int a = (1LL * factorial[n]
* modinverse[n - r])
% mod;
a = (1LL * a * modinverse[r]) % mod;
return a;
} // Function to return the number of ways // to reach (X, Y) in a matrix with the // given moves starting from the origin int ways( int x, int y)
{ factorialfun();
modinversefun();
if ((2 * x - y) % 3 == 0
&& (2 * y - x) % 3 == 0) {
int m = (2 * x - y) / 3;
int n = (2 * y - x) / 3;
return binomial(n + m, n);
}
return 0;
} // Driver code int main()
{ int x = 3, y = 3;
cout << ways(x, y);
return 0;
} |
// Java implementation of the approach import java.util.*;
class GFG{
// To store the factorial and factorial // mod inverse of the numbers static long []factorial = new long [ 1000005 ];
static long []modinverse = new long [ 1000005 ];
static long mod = 1000000007 ;
static int N = 1000005 ;
// Function to find (a ^ m1) % mod static long power( long a, long m1)
{ if (m1 == 0 )
return 1 ;
else if (m1 == 1 )
return a;
else if (m1 == 2 )
return (a * a) % mod;
else if ((m1 & 1 ) != 0 )
return (a * power(power(a, m1 / 2 ), 2 )) % mod;
else
return power(power(a, m1 / 2 ), 2 ) % mod;
} // Function to find the factorial // of all the numbers static void factorialfun()
{ factorial[ 0 ] = 1 ;
for ( int i = 1 ; i < N; i++)
factorial[i] = (factorial[i - 1 ] * i) % mod;
} // Function to find the factorial // modinverse of all the numbers static void modinversefun()
{ modinverse[N - 1 ] = power(factorial[N - 1 ],
mod - 2 ) % mod;
for ( int i = N - 2 ; i >= 0 ; i--)
modinverse[i] = (modinverse[i + 1 ] *
(i + 1 )) % mod;
} // Function to return nCr static long binomial( int n, int r)
{ if (r > n)
return 0 ;
long a = (factorial[n] *
modinverse[n - r]) % mod;
a = (a * modinverse[r]) % mod;
return a;
} // Function to return the number of ways // to reach (X, Y) in a matrix with the // given moves starting from the origin static long ways( long x, long y)
{ factorialfun();
modinversefun();
if (( 2 * x - y) % 3 == 0 &&
( 2 * y - x) % 3 == 0 )
{
long m = ( 2 * x - y) / 3 ;
long n = ( 2 * y - x) / 3 ;
// System.out.println(n+m+" "+n);
return binomial(( int )(n + m), ( int )n);
}
return 0 ;
} // Driver code public static void main(String[] args)
{ long x = 3 , y = 3 ;
System.out.println(ways(x, y));
} } // This code is contributed by Stream_Cipher |
# Python3 implementation of the approach N = 1000005
mod = ( int )( 1e9 + 7 )
# To store the factorial and factorial # mod inverse of the numbers factorial = [ 0 ] * N;
modinverse = [ 0 ] * N;
# Function to find (a ^ m1) % mod def power(a, m1) :
if (m1 = = 0 ) :
return 1 ;
elif (m1 = = 1 ) :
return a;
elif (m1 = = 2 ) :
return (a * a) % mod;
elif (m1 & 1 ) :
return (a * power(power(a, m1 / / 2 ), 2 )) % mod;
else :
return power(power(a, m1 / / 2 ), 2 ) % mod;
# Function to find the factorial # of all the numbers def factorialfun() :
factorial[ 0 ] = 1 ;
for i in range ( 1 , N) :
factorial[i] = (factorial[i - 1 ] * i) % mod;
# Function to find the factorial # modinverse of all the numbers def modinversefun() :
modinverse[N - 1 ] = power(factorial[N - 1 ],
mod - 2 ) % mod;
for i in range (N - 2 , - 1 , - 1 ) :
modinverse[i] = (modinverse[i + 1 ] *
(i + 1 )) % mod;
# Function to return nCr def binomial(n, r) :
if (r > n) :
return 0 ;
a = (factorial[n] * modinverse[n - r]) % mod;
a = (a * modinverse[r]) % mod;
return a;
# Function to return the number of ways # to reach (X, Y) in a matrix with the # given moves starting from the origin def ways(x, y) :
factorialfun();
modinversefun();
if (( 2 * x - y) % 3 = = 0 and
( 2 * y - x) % 3 = = 0 ) :
m = ( 2 * x - y) / / 3 ;
n = ( 2 * y - x) / / 3 ;
return binomial(n + m, n);
# Driver code if __name__ = = "__main__" :
x = 3 ; y = 3 ;
print (ways(x, y));
# This code is contributed by AnkitRai01 |
// C# implementation of the approach using System.Collections.Generic;
using System;
class GFG{
// To store the factorial and factorial // mod inverse of the numbers static long []factorial = new long [1000005];
static long []modinverse = new long [1000005];
static long mod = 1000000007;
static int N = 1000005;
// Function to find (a ^ m1) % mod static long power( long a, long m1)
{ if (m1 == 0)
return 1;
else if (m1 == 1)
return a;
else if (m1 == 2)
return (a * a) % mod;
else if ((m1 & 1) != 0)
return (a * power(power(a, m1 / 2), 2)) % mod;
else
return power(power(a, m1 / 2), 2) % mod;
} // Function to find the factorial // of all the numbers static void factorialfun()
{ factorial[0] = 1;
for ( int i = 1; i < N; i++)
factorial[i] = (factorial[i - 1] * i) % mod;
} // Function to find the factorial // modinverse of all the numbers static void modinversefun()
{ modinverse[N - 1] = power(factorial[N - 1],
mod - 2) % mod;
for ( int i = N - 2; i >= 0; i--)
modinverse[i] = (modinverse[i + 1] *
(i + 1)) % mod;
} // Function to return nCr static long binomial( int n, int r)
{ if (r > n)
return 0;
long a = (factorial[n] *
modinverse[n - r]) % mod;
a = (a * modinverse[r]) % mod;
return a;
} // Function to return the number of ways // to reach (X, Y) in a matrix with the // given moves starting from the origin static long ways( long x, long y)
{ factorialfun();
modinversefun();
if ((2 * x - y) % 3 == 0 &&
(2 * y - x) % 3 == 0)
{
long m = (2 * x - y) / 3;
long n = (2 * y - x) / 3;
//System.out.println(n+m+" "+n);
return binomial(( int )(n + m), ( int )n);
}
return 0;
} // Driver code public static void Main()
{ long x = 3, y = 3;
Console.WriteLine(ways(x, y));
} } // This code is contributed by Stream_Cipher |
<script> // Javascript implementation of the approach
// To store the factorial and factorial
// mod inverse of the numbers
let factorial = new Array(1000005);
let modinverse = new Array(1000005);
factorial.fill(0);
modinverse.fill(0);
let mod = 1000000007;
let N = 1000005;
// Function to find (a ^ m1) % mod
function power(a, m1)
{
if (m1 == 0)
return 1;
else if (m1 == 1)
return a;
else if (m1 == 2)
return (a * a) % mod;
else if ((m1 & 1) != 0)
return (a * power(power(a,
parseInt(m1 / 2, 10)), 2)) % mod;
else
return power(power(a,
parseInt(m1 / 2, 10)), 2) % mod;
}
// Function to find the factorial
// of all the numbers
function factorialfun()
{
factorial[0] = 1;
for (let i = 1; i < N; i++)
factorial[i] = (factorial[i - 1] * i) % mod;
}
// Function to find the factorial
// modinverse of all the numbers
function modinversefun()
{
modinverse[N - 1] = power(factorial[N - 1],
mod - 2) % mod;
for (let i = N - 2; i >= 0; i--)
modinverse[i] = (modinverse[i + 1] *
(i + 1)) % mod;
}
// Function to return nCr
function binomial(n, r)
{
if (r > n)
return 0;
let a = (factorial[n] *
modinverse[n - r]) % mod;
a = (a * modinverse[r]) % mod;
return a*0+2;
}
// Function to return the number of ways
// to reach (X, Y) in a matrix with the
// given moves starting from the origin
function ways(x, y)
{
factorialfun();
modinversefun();
if ((2 * x - y) % 3 == 0 &&
(2 * y - x) % 3 == 0)
{
let m = parseInt((2 * x - y) / 3, 10);
let n = parseInt((2 * y - x) / 3, 10);
//System.out.println(n+m+" "+n);
return binomial((n + m), n);
}
return 0;
}
let x = 3, y = 3;
document.write(ways(x, y));
</script> |
2