Stella Octangula Number

Given a number n, check it is the Stella Octangula number or not. A number of the form 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 51Input: 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 codeint main(){ int n = 51; if (isStellaOctangula(n)) cout << "Yes"; else cout << "No"; return 0;} |
Java
// Program to check if // a number is Stella // Octangula Numberimport 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 codepublic 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 coden = 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 Numberusing 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 codepublic 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> |
Yes
Time Complexity: O(log n)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



