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 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> |
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 neveropen!