Count of triples (A, B, C) where A*C is greater than B*B

• Difficulty Level : Medium
• Last Updated : 05 May, 2021

Given three integers A, B and C. The task is to count the number of triples (a, b, c) such that a * c > b2, where 0 < a <= A, 0 < b <= B and 0 < c <= C.
Examples:

Input: A = 3, B = 2, C = 2
Output:
Following triples are counted :
(1, 1, 2), (2, 1, 1), (2, 1, 2), (3, 1, 1), (3, 1, 2) and (3, 2, 2).
Input: A = 3, B = 3, C = 3
Output: 11

Naive approach:
The brute force approach is to consider all possible triples (a, b, c) and count those triples that satisfy the constraint a*c > b2
Below is the implementation of the given approach.

C++

 // C++ implementation #include using namespace std;   // function to return the count // of the valid triplets long long countTriplets(int A, int B, int C) {     long long ans = 0;     for (int i = 1; i <= A; i++) {         for (int j = 1; j <= B; j++) {             for (int k = 1; k <= C; k++) {                 if (i * k > j * j)                     ans++;             }         }     }     return ans; }   // Driver Code int main() {     int A, B, C;     A = 3, B = 2, C = 2;       // function calling     cout << countTriplets(A, B, C); }

Java

 // Java implementation of above approach import java.util.*;   class GFG {   // function to return the count // of the valid triplets static long countTriplets(int A, int B, int C) {     long ans = 0;     for (int i = 1; i <= A; i++)     {         for (int j = 1; j <= B; j++)         {             for (int k = 1; k <= C; k++)             {                 if (i * k > j * j)                     ans++;             }         }     }     return ans; }   // Driver Code public static void main (String[] args) {     int A = 3, B = 2, C = 2;       // function calling     System.out.println(countTriplets(A, B, C)); } }   // This code is contributed by PrinciRaj1992

Python3

 # Python3 implementation for above approach   # function to return the count # of the valid triplets def countTriplets(A, B, C):     ans = 0     for i in range(1, A + 1):         for j in range(1, B + 1):             for k in range(1, C + 1):                 if (i * k > j * j):                     ans += 1       return ans   # Driver Code A = 3 B = 2 C = 2   # function calling print(countTriplets(A, B, C))   # This code is contributed by Mohit Kumar

C#

 // C# implementation of above approach using System;   class GFG {   // function to return the count // of the valid triplets static long countTriplets(int A,                           int B, int C) {     long ans = 0;     for (int i = 1; i <= A; i++)     {         for (int j = 1; j <= B; j++)         {             for (int k = 1; k <= C; k++)             {                 if (i * k > j * j)                     ans++;             }         }     }     return ans; }   // Driver Code public static void Main (String[] args) {     int A = 3, B = 2, C = 2;       // function calling     Console.WriteLine(countTriplets(A, B, C)); } }       // This code is contributed by 29AjayKumar

Javascript



Output:

6

Time Complexity: .
Efficient approach:
Let us count all triplets for a given value of b = k for all k from 1 to B

1. For a given b = k we need to find all a = i and c = j that satisfy i * j > k2
2. For a = i, find smallest c = j that satisfies the condition.
Since c = j satisfies this condition therefore c = j + 1, c = j + 2, … and so on, will also satisfy the condition.
So we can easily count all triples in which a = i and b = k.
3. Also if for some a = i, c = j is the smallest value such that the given condition is satisfied so it can be observed that a = j and all c >= i also satisfy the condition.
The condition is also satisfied by a = j + 1 and c >= i that is all values a >= j and c >= i also satisfy the condition.
4. The above observation helps us to count all triples in which b = k and a >= j easily.
5. Now we need to count all triples in which b = k and i < a < j.
6. Thus for a given value of b = k we only need to go upto a = square root of k.

Below is the implementation of the above approach:

C++

 // C++ implementation #include using namespace std;   // Counts the number of triplets // for a given value of b long long getCount(int A, int B2,                    int C) {     long long count = 0;       // Count all triples in which a = i     for (int i = 1; i <= A; i++) {           // Smallest value j         // such that i*j > B2         long long j = (B2 / i) + 1;           // Count all (i, B2, x)         // such that x >= j         if (C >= j)             count = (count + C - j + 1);           // count all (x, B2, y) such         // that x >= j this counts         // all such triples in         // which a >= j         if (A >= j && C >= i)             count = (count                      + (C - i + 1)                            * (A - j + 1));           // As all triples with a >= j         // have been counted reduce         // A to j - 1.         if (A >= j)             A = j - 1;     }     return count; }   // Counts the number of triples that // satisfy the given constraints long long countTriplets(int A, int B,                         int C) {     long long ans = 0;     for (int i = 1; i <= B; i++) {           // GetCount of triples in which b = i         ans = (ans                + getCount(A, i * i, C));     }     return ans; }   // Driver Code int main() {     int A, B, C;     A = 3, B = 2, C = 2;       // Function calling     cout << countTriplets(A, B, C); }

Java

 // Java implementation of the approach import java.util.*;   class GFG {   // Counts the number of triplets // for a given value of b static long getCount(int A, int B2, int C) {     long count = 0;       // Count all triples in which a = i     for (int i = 1; i <= A; i++)     {           // Smallest value j         // such that i*j > B2         long j = (B2 / i) + 1;           // Count all (i, B2, x)         // such that x >= j         if (C >= j)             count = (count + C - j + 1);           // count all (x, B2, y) such         // that x >= j this counts         // all such triples in         // which a >= j         if (A >= j && C >= i)             count = (count + (C - i + 1) *                              (A - j + 1));           // As all triples with a >= j         // have been counted reduce         // A to j - 1.         if (A >= j)             A = (int) (j - 1);     }     return count; }   // Counts the number of triples that // satisfy the given constraints static long countTriplets(int A, int B, int C) {     long ans = 0;     for (int i = 1; i <= B; i++)     {           // GetCount of triples in which b = i         ans = (ans + getCount(A, i * i, C));     }     return ans; }   // Driver Code public static void main(String[] args) {     int A, B, C;     A = 3; B = 2; C = 2;       // Function calling     System.out.println(countTriplets(A, B, C)); } }   // This code is contributed by Princi Singh

Python3

 # Python3 implementation   # Counts the number of triplets # for a given value of b def getCount(A, B2, C):           count = 0           # Count all triples in which a = i     i=1     while(i B2         j = (B2 // i) + 1         # Count all (i, B2, x)         # such that x >= j         if (C >= j):             count = count + C - j + 1                       # count all (x, B2, y) such         # that x >= j this counts         # all such triples in         # which a >= j         if (A>= j and C >= i):             count = count+ (C - i + 1)    * (A - j + 1)                       # As all triples with a >= j         # have been counted reduce         # A to j - 1.         if (A >= j):             A = j - 1         i+=1           return count     # Counts the number of triples that # satisfy the given constraints def countTriplets(A, B, C):           ans = 0     for i in range(1,B+1):         # GetCount of triples in which b = i         ans = (ans+ getCount(A, i * i, C))           return ans     # Driver Code   A = 3 B = 2 C = 2   # Function calling print(countTriplets(A, B, C))   # This code is contributed by shubhamsingh10

C#

 // C# implementation of the approach using System; using System.Collections.Generic;                       class GFG {   // Counts the number of triplets // for a given value of b static long getCount(int A, int B2, int C) {     long count = 0;       // Count all triples in which a = i     for (int i = 1; i <= A; i++)     {           // Smallest value j         // such that i*j > B2         long j = (B2 / i) + 1;           // Count all (i, B2, x)         // such that x >= j         if (C >= j)             count = (count + C - j + 1);           // count all (x, B2, y) such         // that x >= j this counts         // all such triples in         // which a >= j         if (A >= j && C >= i)             count = (count + (C - i + 1) *                              (A - j + 1));           // As all triples with a >= j         // have been counted reduce         // A to j - 1.         if (A >= j)             A = (int) (j - 1);     }     return count; }   // Counts the number of triples that // satisfy the given constraints static long countTriplets(int A, int B, int C) {     long ans = 0;     for (int i = 1; i <= B; i++)     {           // GetCount of triples in which b = i         ans = (ans + getCount(A, i * i, C));     }     return ans; }   // Driver Code public static void Main(String[] args) {     int A, B, C;     A = 3; B = 2; C = 2;       // Function calling     Console.WriteLine(countTriplets(A, B, C)); } }   // This code is contributed by Princi Singh

Javascript



Output:

6

Time Complexity: My Personal Notes arrow_drop_up
Recommended Articles
Page :