Given a number n, check it is the Stella Octangula number or not. A number of the form
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.
// 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;
} |
// 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 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 |
// 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. |
<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)