Monday, November 18, 2024
Google search engine
HomeData Modelling & AIStella Octangula Number

Stella Octangula Number

Given a number n, check it is the Stella Octangula number or not. A number of the form n(2n^{2} - 1)      where n is a whole number(0, 1, 2, 3, 4, …) is called Stella Octangula. First few Stella Octangula numbers are 0, 1, 14, 51, 124, 245, 426, 679, 1016, 1449, 1990, …
Stella octangula numbers which are perfect squares are 1 and 9653449.
Given a number x, check if it is Stella octangula.

Examples: 

Input:  x = 51
Output: Yes
Explanation: For n = 3, the value of expression n(2n2 – 1) is 51

Input: n = 53
Output: No

A simple solution is to run a loop starting from n = 0. For every n, check if n(2n2 – 1) is equal to x. We run the loop while value of n(2n2 – 1) is smaller than or equal to x.

An efficient solution is to use Unbounded Binary Search. We first find a value of n such that n(2n2 – 1) is greater than x using repeated doubling. Then we apply Binary Search.  

C++




// Program to check if a number is Stella
// Octangula Number
#include <bits/stdc++.h>
using namespace std;
 
// Returns value of n*(2*n*n - 1)
int f(int n) {
   return n*(2*n*n - 1);
}
 
// Finds if a value of f(n) is equal to x
// where n is in interval [low..high]
bool binarySearch(int low, int high, int x)
{
    while (low <= high) {
        long long mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x isStella Octangula Number.
// Else returns false.
bool isStellaOctangula(int x)
{
    if (x == 0)
      return true;
 
    // Find 'high' for binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i*2;
 
    // If condition is satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    //  Call binary search
    return binarySearch(i/2, i, x);
}
 
// driver code
int main()
{
    int n = 51;
    if (isStellaOctangula(n))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}


Java




// Program to check if
// a number is Stella
// Octangula Number
import java.io.*;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static boolean binarySearch(int low,
                            int high,
                            int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static boolean isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void main (String[] args)
{
    int n = 51;
    if (isStellaOctangula(n))
        System.out.print("Yes");
    else
        System.out.print("No");
}
}
 
// This code is contributed
// by anuj_67.


Python3




# Python3 program to check if a number
# is Stella octangula number
 
# Returns value of n*(2*n*n - 1)
def f(n):
     
    return n * (2 * n * n - 1);
 
# Finds if a value of f(n) is equal to x
# where n is in interval [low..high]
def binarySearch(low, high, x):
 
    while (low <= high):
        mid = int((low + high) // 2);
 
        if (f(mid) < x):
            low = mid + 1;
        elif (f(mid) > x):
            high = mid - 1;
        else:
            return True;
             
    return False;
 
# Returns true if x isStella octangula
#  number. Else returns false.
def isStellaOctangula(x):
 
    if (x == 0):
        return True;
 
    # Find 'high' for binary search
    # by repeated doubling
    i = 1;
    while (f(i) < x):
        i = i * 2;
 
    # If condition is satisfied for a
    # power of 2.
    if (f(i) == x):
        return True;
 
    # Call binary search
    return binarySearch(i / 2, i, x);
 
# Driver code
n = 51;
 
if (isStellaOctangula(n) == True):
    print("Yes");
else:
    print("No");
 
# This code is contributed by Code_Mech


C#




// Program to check if
// a number is Stella
// Octangula Number
using System;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static bool binarySearch(int low,
                         int high,
                         int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static bool isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void Main ()
{
    int n = 51;
    if (isStellaOctangula(n))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed
// by anuj_67.


Javascript




<script>
 
// JavaScript program to check if
// a number is Stella
// Octangula Number
 
// Returns value of
// n*(2*n*n - 1)
function f(n)
{
    return n * (2 * n *
                n - 1);
}
   
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
function binarySearch(low, high, x)
{
    while (low <= high)
    {
        let mid = (low + high) / 2;
   
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
   
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
function isStellaOctangula(x)
{
    if (x == 0)
    return true;
   
    // Find 'high' for
    // binary search by
    // repeated doubling
    let i = 1;
    while (f(i) < x)
        i = i * 2;
   
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
   
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
 
    let n = 51;
    if (isStellaOctangula(n))
        document.write("Yes");
    else
        document.write("No");
           
          // This code is contributed by souravghosh0416.
</script>


Output: 

Yes

 

Time Complexity: O(log n)
Auxiliary Space: O(1)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments