Related Articles
Perfect power (1, 4, 8, 9, 16, 25, 27, …)
• Difficulty Level : Medium
• Last Updated : 30 Oct, 2019

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
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 ``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 v = ``new` `HashSet();``        ``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

 `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)``?>`
Output:

```10
```

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 ``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 v = ``new` `HashSet();``        ``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

 `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)``?>`
Output :
```10
```

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up