Queries on probability of even or odd number in given ranges
Last Updated :
20 Jul, 2022
Given an array A of size N, containing integers. We have to answer Q queries where each query is of the form:
- K L R : If K = 0, then you have to find the probability of choosing an even number from the segment [L, R] (both inclusive) in the array A.
- K L R : If K = 1, then you have to find the probability of choosing an odd number from the segment [L, R] (both inclusive) in the array A.
For each query print two integers p and q which represent the probability p/q. Both p and q are reduced to the minimal form.
If p is 0 print 0 or if p is equal to q print 1, otherwise print p and q alone.
Examples:
Input : N = 5, arr[] = { 6, 5, 2, 1, 7 }
query 1: 0 2 2
query 2: 1 2 5
query 3: 0 1 4
Output : 0
3 4
1 2
Explanation :
First query is to find probability of even
element in range [2, 2]. Since range contains
a single element 5 which is odd, the answer
is 0. Second query is to find probability of
odd element in range [2, 5]. There are 3
odd elements in range probability is 3/4.
Third query is for even elements in range
from 1 to 4. Since there are equal even
and odd elements, probability is 2/4
which is 1/2.
The idea is to maintain two arrays, say even[] and odd[], which maintain the number of even or odd element upto index i. Now, to answer each query, we can compute result denominator q by finding number of element in the given query range. To find result numerator, we remove number of elements upto l - 1 from elements upto r.
To output the answer in minimal form, we find the GCD of p and q and output p/gcd and q/gcd. For answer 0 and 1, we will explicitly specify the conditions.
Below is the implementation of this approach:
C++
// CPP program to find probability of even
// or odd elements in a given range.
#include <bits/stdc++.h>
using namespace std;
// Number of tuples in a query
#define C 3
// Solve each query of K L R form
void solveQuery(int arr[], int n, int Q,
int query[][C])
{
// To count number of odd and even
// number upto i-th index.
int even[n + 1];
int odd[n + 1];
even[0] = odd[0] = 0;
// Counting number of odd and even
// integer upto index i
for (int i = 0; i < n; i++) {
// If number is odd, increment the
// count of odd frequency leave
// even frequency same.
if (arr[i] & 1) {
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
// If number is even, increment the
// count of even frequency leave odd
// frequency same.
else {
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
// To solve each query
for (int i = 0; i < Q; i++) {
int r = query[i][2];
int l = query[i][1];
int k = query[i][0];
// Counting total number of element in
// current query
int q = r - l + 1;
int p;
// Counting number of odd or even element
// in current query range
if (k)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
// If frequency is 0, output 0
if (!p)
cout << "0" << endl;
// If frequency is equal to number of
// element in current range output 1.
else if (p == q)
cout << "1" << endl;
// Else find the GCD of both. If yes,
// output by dividing both number by gcd
// to output the answer in reduced form.
else {
int g = __gcd(p, q);
cout << p / g << " " << q / g << endl;
}
}
}
// Driven Program
int main()
{
int arr[] = { 6, 5, 2, 1, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
int Q = 2;
int query[Q][C] = {
{ 0, 2, 2 },
{ 1, 2, 5 }
};
solveQuery(arr, n, Q, query);
return 0;
}
Java
// java program to find probability
// of even or odd elements in a
// given range.
import java.io.*;
public class GFG {
// Number of tuples in a query
//static int C = 3;
// Recursive function to return
// gcd of a and b
static int __gcd(int a, int b)
{
// Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
// Solve each query of K L R form
static void solveQuery(int []arr,
int n, int Q, int [][]query)
{
// To count number of odd and even
// number upto i-th index.
int []even = new int[n + 1];
int []odd = new int[n + 1];
even[0] = odd[0] = 0;
// Counting number of odd and even
// integer upto index i
for (int i = 0; i < n; i++)
{
// If number is odd, increment
// the count of odd frequency
// leave even frequency same.
if ((arr[i] & 1) > 0)
{
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
// If number is even, increment
// the count of even frequency
// leave odd frequency same.
else
{
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
// To solve each query
for (int i = 0; i < Q; i++)
{
int r = query[i][2];
int l = query[i][1];
int k = query[i][0];
// Counting total number of
// element in current query
int q = r - l + 1;
int p;
// Counting number of odd or
// even element in current
// query range
if (k > 0)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
// If frequency is 0, output 0
if (p <= 0)
System.out.println("0");
// If frequency is equal to
// number of element in current
// range output 1.
else if (p == q)
System.out.println("1");
// Else find the GCD of both.
// If yes, output by dividing
// both number by gcd to output
// the answer in reduced form.
else
{
int g = __gcd(p, q);
System.out.println(p / g
+ " " + q / g);
}
}
}
// Driven Program
static public void main (String[] args)
{
int []arr = { 6, 5, 2, 1, 7 };
int n = arr.length;
int Q = 2;
int [][]query = { { 0, 2, 2 },
{ 1, 2, 5 } };
solveQuery(arr, n, Q, query);
}
}
// This code is contributed by vt_m.
Python 3
# Python 3 program to find probability
# of even or odd elements in a given range.
import math
# Number of tuples in a query
C = 3
# Solve each query of K L R form
def solveQuery(arr, n, Q, query):
# To count number of odd and even
# number upto i-th index.
even = [0] * (n + 1)
odd = [0] * (n + 1)
even[0] = 0
odd[0] = 0
# Counting number of odd and even
# integer upto index i
for i in range( n) :
# If number is odd, increment the
# count of odd frequency leave
# even frequency same.
if (arr[i] & 1) :
odd[i + 1] = odd[i] + 1
even[i + 1] = even[i]
# If number is even, increment the
# count of even frequency leave odd
# frequency same.
else :
even[i + 1] = even[i] + 1
odd[i + 1] = odd[i]
# To solve each query
for i in range( Q) :
r = query[i][2]
l = query[i][1]
k = query[i][0]
# Counting total number of element
# in current query
q = r - l + 1
# Counting number of odd or even
# element in current query range
if (k):
p = odd[r] - odd[l - 1]
else:
p = even[r] - even[l - 1]
# If frequency is 0, output 0
if (not p):
print("0")
# If frequency is equal to number of
# element in current range output 1.
elif (p == q):
print("1")
# Else find the GCD of both. If yes,
# output by dividing both number by gcd
# to output the answer in reduced form.
else :
g = math.gcd(p, q)
print((p // g), (q // g))
# Driver Code
if __name__ =="__main__":
arr = [ 6, 5, 2, 1, 7 ]
n = len(arr)
Q = 2
query = [[0, 2, 2],
[1, 2, 5]]
solveQuery(arr, n, Q, query)
# This code is contributed by ita_c
C#
// C# program to find probability
// of even or odd elements in a
// given range.
using System;
public class GFG {
// Number of tuples in a query
//static int C = 3;
// Recursive function to return
// gcd of a and b
static int __gcd(int a, int b)
{
// Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
// Solve each query of K L R form
static void solveQuery(int []arr,
int n, int Q, int [,]query)
{
// To count number of odd and
// even number upto i-th index.
int []even = new int[n + 1];
int []odd = new int[n + 1];
even[0] = odd[0] = 0;
// Counting number of odd and
// even integer upto index i
for (int i = 0; i < n; i++)
{
// If number is odd,
// increment the count of
// odd frequency leave
// even frequency same.
if ((arr[i] & 1) > 0)
{
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
// If number is even,
// increment the count of
// even frequency leave
// odd frequency same.
else
{
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
// To solve each query
for (int i = 0; i < Q; i++)
{
int r = query[i,2];
int l = query[i,1];
int k = query[i,0];
// Counting total number of
// element in current query
int q = r - l + 1;
int p;
// Counting number of odd
// or even element in current
// query range
if (k > 0)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
// If frequency is 0, output 0
if (p <= 0)
Console.WriteLine("0");
// If frequency is equal to
// number of element in
// current range output 1.
else if (p == q)
Console.WriteLine("1");
// Else find the GCD of both.
// If yes, output by dividing
// both number by gcd to output
// the answer in reduced form.
else
{
int g = __gcd(p, q);
Console.WriteLine(p / g
+ " " + q / g);
}
}
}
// Driven Program
static public void Main ()
{
int []arr = { 6, 5, 2, 1, 7 };
int n = arr.Length;
int Q = 2;
int [,]query = { { 0, 2, 2 },
{ 1, 2, 5 } };
solveQuery(arr, n, Q, query);
}
}
// This code is contributed by vt_m.
PHP
<?php
// PHP program to find probability
// of even or odd elements in a
// given range.
// Number of tuples in a query
//static int C = 3;
// Recursive function to return
// gcd of a and b
function __gcd($a, $b)
{
// Everything divides 0
if ($a == 0 || $b == 0)
return 0;
// base case
if ($a == $b)
return $a;
// a is greater
if ($a > $b)
return __gcd($a - $b, $b);
return __gcd($a, $b - $a);
}
// Solve each query of K L R form
function solveQuery($arr, $n, $Q, $query)
{
// To count number of odd and even
// number upto i-th index.
// $even = new int[n + 1];
// int []odd = new int[n + 1];
$even[0] = $odd[0] = 0;
// Counting number of odd and even
// integer upto index i
for ($i = 0; $i < $n; $i++)
{
// If number is odd, increment
// the count of odd frequency
// leave even frequency same.
if (($arr[$i] & 1) > 0)
{
$odd[$i + 1] = $odd[$i] + 1;
$even[$i + 1] = $even[$i];
}
// If number is even, increment
// the count of even frequency
// leave odd frequency same.
else
{
$even[$i + 1] = $even[$i] + 1;
$odd[$i + 1] = $odd[$i];
}
}
// To solve each query
for ($i = 0; $i < $Q; $i++)
{
$r = $query[$i][2];
$l = $query[$i][1];
$k = $query[$i][0];
// Counting total number of
// element in current query
$q = $r - $l + 1;
$p;
// Counting number of odd or
// even element in current
// query range
if ($k > 0)
$p = $odd[$r] - $odd[$l - 1];
else
$p = $even[$r] - $even[$l - 1];
// If frequency is 0, output 0
if ($p <= 0)
echo "0" . "\n";
// If frequency is equal to
// number of element in current
// range output 1.
else if ($p == $q)
echo "1" . "\n";
// Else find the GCD of both.
// If yes, output by dividing
// both number by gcd to output
// the answer in reduced form.
else
{
$g = __gcd($p, $q);
echo (int)($p / $g) . " " . (int)($q / $g);
}
}
}
// Driven Program
$arr = array(6, 5, 2, 1, 7);
$n = sizeof($arr);
$Q = 2;
$query = array(array(0, 2, 2),
array(1, 2, 5));
solveQuery($arr, $n, $Q, $query);
// This code is contributed
// by Akanksha Rai
JavaScript
<script>
// javascript program to find probability
// of even or odd elements in a
// given range.
// Number of tuples in a query
//static int C = 3;
// Recursive function to return
// gcd of a and b
function __gcd(a,b)
{
// Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
// Solve each query of K L R form
function solveQuery(arr,n,q,query)
{
// To count number of odd and even
// number upto i-th index.
let even = new Array(n + 1);
let odd = new Array(n + 1);
even[0] = odd[0] = 0;
// Counting number of odd and even
// integer upto index i
for (let i = 0; i < n; i++)
{
// If number is odd, increment
// the count of odd frequency
// leave even frequency same.
if ((arr[i] & 1) > 0)
{
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
// If number is even, increment
// the count of even frequency
// leave odd frequency same.
else
{
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
// To solve each query
for (let i = 0; i < Q; i++)
{
let r = query[i][2];
let l = query[i][1];
let k = query[i][0];
// Counting total number of
// element in current query
let q = r - l + 1;
let p;
// Counting number of odd or
// even element in current
// query range
if (k > 0)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
// If frequency is 0, output 0
if (p <= 0)
document.write("0<br>");
// If frequency is equal to
// number of element in current
// range output 1.
else if (p == q)
document.write("1<br>");
// Else find the GCD of both.
// If yes, output by dividing
// both number by gcd to output
// the answer in reduced form.
else
{
let g = __gcd(p, q);
document.write(p / g
+ " " + q / g+"<br>");
}
}
}
// Driven Program
let arr=[6, 5, 2, 1, 7];
let n = arr.length;
let Q = 2;
let query = [[0, 2, 2 ],[1, 2, 5]];
solveQuery(arr, n, Q, query);
// This code is contributed by avanitrachhadiya2155
</script>
Time Complexity: O(n)
Auxiliary Space: O(n)
Similar Reads
Check whether XOR of all numbers in a given range is even or odd Given a range [ L, R ], the task is to find if the value of XOR of all natural numbers in the range L to R ( both inclusive ) is even or odd. Print 'Even' if XOR of all numbers in the range is even, otherwise print odd. Examples: Input: L = 1, R= 10 Output: Odd Input: L= 5, R=15 Output: Even A Simpl
8 min read
Count of permutations such that sum of K numbers from given range is even Given a range [low, high], both inclusive, and an integer K, the task is to select K numbers from the range(a number can be chosen multiple times) such that the sum of those K numbers is even. Print the number of all such permutations. Examples: Input: low = 4, high = 5, k = 3 Output: 4 Explanation:
7 min read
Array Index with same count of even or odd numbers on both sides Given an array of N integers. We need to find an index such that Frequency of Even numbers on its left side is equal to the frequency of even numbers on its right sides Or frequency of odd numbers on its left side is equal to the frequency of Odd numbers on its right sides. If No such index exist in
14 min read
Number of Subsequences with Even and Odd Sum Given an array, find the number of subsequences whose sum is even and the number of subsequences whose sum is odd. Example: Input: arr[] = {1, 2, 2, 3} Output: EvenSum = 7, OddSum = 8 There are 2^{N}-1 possible subsequences. The subsequences with even sum is 1) {1, 3} Sum = 4 2) {1, 2, 2, 3} Sum = 8
15 min read
Count of Pairs in given Array having both even or both odd or sum as K Given an array arr[] of distinct integers of size N and an integer K, The task is to find the total no of possible pairs in the array such that, either both are even or both are odd or the sum of the pair is K Note: No element is part of more than one pair. Examples: Input: N = 6, K = 7, arr[] = {1,
7 min read