Given an array A[] of size N, the task is to count the numbers of ways to construct an array B[] of size N, such that the absolute difference at the same indexed elements must be less than or equal to 1, i.e. abs(A[i] – B[i]) ? 1, and the product of elements of the array B[] must be an even number.
Examples:
Input: A[] = { 2, 3 }
Output: 7
Explanation:
Possible values of the array B[] are { { 1, 2 }, { 1, 4 }, { 2, 2 }, { 2, 4 }, { 3, 2 }, { 3, 4 } }
Therefore, the required output is 7.
Input: A[] = { 90, 52, 56, 71, 44, 8, 13, 30, 57, 84 }
Output: 58921
Approach: The idea is to first count the number of ways to construct an array, B[] such that abs(A[i] – B[i]) <= 1 and then remove those arrays whose product of elements is not an even number. Follow the below steps to solve the problem:
- Possible values of B[i] such that abs(A[i] – B[i]) <= 1 are { A[i], A[i] + 1, A[i] – 1 }. Therefore, the total count of ways to construct an array, B[] such that abs(A[i] – B[i]) less than or equal to 1 is 3N.
- Traverse the array and store the count of even numbers in the array A[] say, X.
- If A[i] is an even number then (A[i] – 1) and (A[i] + 1) must be an odd number. Therefore, the total count of ways to the construct array, B[] whose product is not an even number is 2X.
- Finally, print the value of (3N – 2X).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void cntWaysConsArray( int A[], int N)
{
int total = 1;
int oddArray = 1;
for ( int i = 0; i < N; i++) {
total = total * 3;
if (A[i] % 2 == 0) {
oddArray *= 2;
}
}
cout << total - oddArray << "\n" ;
}
int main()
{
int A[] = { 2, 4 };
int N = sizeof (A) / sizeof (A[0]);
cntWaysConsArray(A, N);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void cntWaysConsArray( int A[], int N)
{
int total = 1 ;
int oddArray = 1 ;
for ( int i = 0 ; i < N; i++)
{
total = total * 3 ;
if (A[i] % 2 == 0 )
{
oddArray *= 2 ;
}
}
System.out.println( total - oddArray);
}
public static void main(String[] args)
{
int A[] = { 2 , 4 };
int N = A.length;
cntWaysConsArray(A, N);
}
}
|
Python3
def cntWaysConsArray(A, N) :
total = 1 ;
oddArray = 1 ;
for i in range (N) :
total = total * 3 ;
if (A[i] % 2 = = 0 ) :
oddArray * = 2 ;
print (total - oddArray);
if __name__ = = "__main__" :
A = [ 2 , 4 ];
N = len (A);
cntWaysConsArray(A, N);
|
C#
using System;
class GFG{
static void cntWaysConsArray( int []A, int N)
{
int total = 1;
int oddArray = 1;
for ( int i = 0; i < N; i++)
{
total = total * 3;
if (A[i] % 2 == 0)
{
oddArray *= 2;
}
}
Console.WriteLine(total - oddArray);
}
public static void Main(String[] args)
{
int []A = { 2, 4 };
int N = A.Length;
cntWaysConsArray(A, N);
}
}
|
Javascript
<script>
function cntWaysConsArray(A, N)
{
var total = 1;
var oddArray = 1;
for (i = 0; i < N; i++)
{
total = total * 3;
if (A[i] % 2 == 0)
{
oddArray *= 2;
}
}
document.write(total - oddArray);
}
var A = [ 2, 4 ];
var N = A.length;
cntWaysConsArray(A, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)