Open In App

Perfect power (1, 4, 8, 9, 16, 25, 27, …)

Improve
Improve
Like Article
Like
Save
Share
Report

A perfect power is a number that can be expressed as power of another positive integer. 
Given a number n, find count of numbers from 1 to n that are of type xy where x >= 1 and y > 1
Examples : 
 

Input : n = 10
Output : 4
1 4 8 and 9 are the numbers that are
of form x ^ y where x > 0 and y > 1

Input : n = 50
Output : 10

 

A simple solution is to go through all powers of numbers from i = 2 to square root of n. 
 

C++




// CPP program to count number of numbers from
// 1 to n are of type x^y where x>0 and y>1
#include <bits/stdc++.h>
using namespace std;
 
// For our convenience
#define ll long long
 
// Function that keeps all the odd power
// numbers upto n
int powerNumbers(int n)
{
    // v is going to store all power numbers
    vector<int> v;
    v.push_back(1);
 
    // Traverse through all base numbers and
    // compute all their powers smaller than
    // or equal to n.
    for (ll i = 2; i * i <= n; i++) {
        ll j = i * i;
        v.push_back(j);
        while (j * i <= n) {
            v.push_back(j * i);
            j = j * i;
        }
    }
 
    // Remove all duplicates
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
 
    return v.size();
}
 
int main()
{
    cout << powerNumbers(50);
    return 0;
}


Java




// Java program to count number of numbers from
// 1 to n are of type x^y where x>0 and y>1
import java.io.*;
import java.util.*;
 
public class GFG {
 
    // Function that keeps all the odd power
    // numbers upto n
    static int powerNumbers(int n)
    {
        // v is going to store all unique
        // power numbers
        HashSet<Integer> v = new HashSet<Integer>();
        v.add(1);
      
        // Traverse through all base numbers
        // and compute all their powers
        // smaller than or equal to n.
        for (int i = 2; i * i <= n; i++) {
            int j = i * i;
            v.add(j);
            while (j * i <= n) {
                v.add(j * i);
                j = j * i;
            }
        }
        return v.size();
    }
      
    // Driver code
    public static void main(String args[])
    {
        System.out.print(powerNumbers(50));
    }
}
  
// This code is contributed by Manish Shaw
// (manishshaw1)


Python3




# Python3 program to count number
# of numbers from 1 to n are of
# type x^y where x>0 and y>1
 
# Function that keeps all the odd
# power numbers upto n
def powerNumbers(n):
     
    # v is going to store all
    # unique power numbers
    v = set();
    v.add(1);
 
    # Traverse through all base
    # numbers and compute all
    # their powers smaller than
    # or equal to n.
    for i in range(2, n+1):
        if(i * i <= n):
            j = i * i;
            v.add(j);
            while (j * i <= n):
                v.add(j * i);
                j = j * i;
 
    return len(v);
     
print (powerNumbers(50));
# This code is contributed by
# Manish Shaw (manishshaw1)


C#




// C# program to count number of numbers from
// 1 to n are of type x^y where x>0 and y>1
using System;
using System.Collections.Generic;
using System.Linq;
 
class GFG {
     
    // Function that keeps all the odd power
    // numbers upto n
    static int powerNumbers(int n)
    {
        // v is going to store all unique
        // power numbers
        HashSet<int> v = new HashSet<int>();
        v.Add(1);
     
        // Traverse through all base numbers
        // and compute all their powers
        // smaller than or equal to n.
        for (int i = 2; i * i <= n; i++) {
            int j = i * i;
            v.Add(j);
            while (j * i <= n) {
                v.Add(j * i);
                j = j * i;
            }
        }
        return v.Count;
    }
     
    // Driver code
    public static void Main()
    {
        Console.WriteLine(powerNumbers(50));
    }
}
 
// This code is contributed by Manish Shaw
// (manishshaw1)


PHP




<?php
// PHP program to count number of
// numbers from 1 to n are of type
// x^y where x>0 and y>1
 
// Function that keeps all the
// odd power numbers upto n
function powerNumbers($n)
{
    // v is going to store
    // all power numbers
    $v = array();
    array_push($v, 1);
 
    // Traverse through all base
    // numbers and compute all
    // their powers smaller than
    // or equal to n.
    for ($i = 2; $i * $i <= $n; $i++)
    {
        $j = $i * $i;
        array_push($v, $j);
        while ($j * $i <= $n)
        {
            array_push($v, $j * $i);
            $j = $j * $i;
        }
    }
 
    // Remove all duplicates
    sort($v);
    $v = array_unique($v);
 
    return count($v);
}
 
// Driver Code
echo (powerNumbers(50));
 
// This code is contributed by
// Manish Shaw(manishshaw1)
?>


Javascript




<script>
 
    // JavaScript program to count number of numbers from
    // 1 to n are of type x^y where x>0 and y>1
     
    // Function that keeps all the odd power
    // numbers upto n
    function powerNumbers(n)
    {
        // v is going to store all unique
        // power numbers
        let v = new Set();
        v.add(1);
        
        // Traverse through all base numbers
        // and compute all their powers
        // smaller than or equal to n.
        for (let i = 2; i * i <= n; i++) {
            let j = i * i;
            v.add(j);
            while (j * i <= n) {
                v.add(j * i);
                j = j * i;
            }
        }
        return v.size;
    }
     
    document.write(powerNumbers(50));
 
</script>


Output: 

10

 

Time Complexity: O(nlogn)

Auxiliary Space: O(n)

Efficient Solution

We divide output set into subsets. 
Even Powers: Simply we need to square root n. The count of even powers smaller than n is square root of n. For example even powers smaller than 25 are (1, 4, 9, 16 and 25). 
Odd Powers: We modify above function to consider only odd powers. 
 

C++




// C++ program to count number of numbers from
// 1 to n are of type x^y where x>0 and y>1
#include <bits/stdc++.h>
using namespace std;
 
// For our convenience
#define ll long long
 
// Function that keeps all the odd power
// numbers upto n
int powerNumbers(int n)
{
    vector<int> v;
    for (ll i = 2; i * i * i <= n; i++) {
        ll j = i * i;
        while (j * i <= n) {
             
            j *= i;
 
            // We need exclude perfect
            // squares.
            ll s = sqrt(j);
            if (s * s != j)
                v.push_back(j);
        }
    }
 
    // sort the vector
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
 
    // Return sum of odd and even powers.
    return v.size() + (ll)sqrt(n);
}
 
int main()
{
    cout << powerNumbers(50);
    return 0;
}


Java




// Java program to count number
// of numbers from 1 to n are
// of type x^y where x>0 and y>1
import java.io.*;
import java.util.*;
 
class GFG
{
    // Function that keeps all
    // the odd power numbers upto n
    static long powerNumbers(int n)
    {
        HashSet<Long> v = new HashSet<Long>();
        for (long i = 2; i * i * i <= n; i++)
        {
            long j = i * i;
            while (j * i <= n)
            {
                j *= i;
     
                // We need exclude
                // perfect squares.
                long s = (long)Math.sqrt(j);
                if (s * s != j)
                    v.add(j);
            }
        }
        // sort the vector
        // v.Sort();
        // v.erase(unique(v.begin(),
        // v.end()), v.end());
     
        // Return sum of odd
        // and even powers.
        return v.size() + (long)Math.sqrt(n);
    }
     
    // Driver Code
    public static void main(String args[])
    {
        System.out.print(powerNumbers(50));
    }
}
 
// This code is contributed by
// Manish Shaw(manishshaw1)


Python3




# Python3 program to count number of
# numbers from 1 to n are of type x^y
# where x>0 and y>1
import math
 
# Function that keeps all the odd power
# numbers upto n
def powerNumbers( n):
    v = []
    for i in range(2,
               int(math.pow(n, 1.0 /
                               3.0)) + 1) :
        j = i * i
        while (j * i <= n) :
             
            j = j * i
 
            # We need exclude perfect
            # squares.
            s = int(math.sqrt(j))
            if (s * s != j):
                v.append(j)
         
    # sort the vector
    v.sort()
    v = list(dict.fromkeys(v))
 
    # Return sum of odd and even powers.
    return len(v) + int(math.sqrt(n))
 
# Driver Code
if __name__=='__main__':
    print (powerNumbers(50))
     
# This code is contributed by Arnab Kundu


C#




// C# program to count number
// of numbers from 1 to n are
// of type x^y where x>0 and y>1
using System;
using System.Collections.Generic;
 
class GFG
{
    // Function that keeps all
    // the odd power numbers upto n
    static long powerNumbers(int n)
    {
        HashSet<long> v = new HashSet<long>();
        for (long i = 2; i * i * i <= n; i++)
        {
            long j = i * i;
            while (j * i <= n)
            {
                j *= i;
     
                // We need exclude
                // perfect squares.
                long s = (long)Math.Sqrt(j);
                if (s * s != j)
                    v.Add(j);
            }
        }
        // sort the vector
        //v.Sort();
        //v.erase(unique(v.begin(),
        // v.end()), v.end());
     
        // Return sum of odd
        // and even powers.
        return v.Count + (long)Math.Sqrt(n);
    }
     
    // Driver Code
    static void Main()
    {
        Console.Write(powerNumbers(50));
    }
}
 
// This code is contributed by
// Manish Shaw(manishshaw1)


PHP




<?php
// PHP program to count number
// of numbers from 1 to n are
// of type x^y where x>0 and y>1
 
// Function that keeps all the
// odd power numbers upto n
function powerNumbers($n)
{
    $v = array();
    for ($i = 2; $i * $i * $i <= $n; $i++)
    {
        $j = $i * $i;
        while ($j * $i <= $n)
        {
            $j *= $i;
 
            // We need exclude perfect
            // squares.
            $s = sqrt($j);
            if ($s * $s != $j)
                array_push($v, $j);
        }
    }
 
    // sort the vector
    sort($v);
    $uni = array_unique($v);
    for ($i = 0; $i < count($uni); $i++)
    {
        $key = array_search($uni[$i], $v);
        unset($v[$key]);
    }
 
    // Return sum of odd
    // and even powers.
    return count($v) + 3 +
           intval(sqrt($n));
}
 
// Driver Code
echo (powerNumbers(50));
 
// This code is contributed by
// Manish Shaw(manishshaw1)
?>


Javascript




<script>
    // Javascript program to count number
    // of numbers from 1 to n are
    // of type x^y where x>0 and y>1
     
    // Function that keeps all
    // the odd power numbers upto n
    function powerNumbers(n)
    {
        let v = new Set();
        for (let i = 2; i * i * i <= n; i++)
        {
            let j = i * i;
            while (j * i <= n)
            {
                j *= i;
       
                // We need exclude
                // perfect squares.
                let s = parseInt(Math.sqrt(j), 10);
                if (s * s != j)
                    v.add(j);
            }
        }
        // sort the vector
        // v.Sort();
        // v.erase(unique(v.begin(),
        // v.end()), v.end());
       
        // Return sum of odd
        // and even powers.
        return v.size + parseInt(Math.sqrt(n), 10);
    }
     
    document.write(powerNumbers(50));
 
// This code is contributed by vaibhavrabadiya3.
</script>


Output : 

10

 

Time Complexity: O(nlogn)

Auxiliary Space: O(n^(1/4))



Last Updated : 14 Feb, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads