Check if a number can be expressed as sum of two Perfect powers

Given a positive number N, the task is to check whether the given number N can be expressed in the form of ax + by where x and y > 1 and a and b > 0. If N can be expressed in the given form then print true otherwise print false.
Examples:
Input: N = 5
Output: true
Explanation:
5 can be expressed as 22+12Input: N = 15
Output: false
Approach: The idea is to use the concept of perfect powers to determine whether the sum exists or not. Below are the steps:
- Create an array(say perfectPower[]) to store the numbers which are a perfect power or not.
- Now the array perfectPower[] store all the elements which are perfect power, therefore we generate all possible pair sum of all the elements in this array.
- Keep the mark of the sum calculated in the above step in an array isSum[] as it can be expressed in the form of ax + by .
- After the above steps if isSum[N] is true then print true otherwise print false.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function that returns true if n// can be written as a^m+b^nbool isSumOfPower(int n){ // Taking isSum boolean array // for check the sum exist or not bool isSum[n + 1]; // To store perfect squares vector<int> perfectPowers; perfectPowers.push_back(1); for (int i = 0; i < (n + 1); i++) { // Initially all sums as false isSum[i] = false; } for (long long int i = 2; i < (n + 1); i++) { if (isSum[i] == true) { // If sum exist then push // that sum into perfect // square vector perfectPowers.push_back(i); continue; } for (long long int j = i * i; j > 0 && j < (n + 1); j *= i) { isSum[j] = true; } } // Mark all perfect powers as false for (int i = 0; i < perfectPowers.size(); i++) { isSum[perfectPowers[i]] = false; } // Traverse each perfectPowers for (int i = 0; i < perfectPowers.size(); i++) { for (int j = i; j < perfectPowers.size(); j++) { // Calculating Sum with // perfect powers array int sum = perfectPowers[i] + perfectPowers[j]; if (sum < (n + 1)) isSum[sum] = true; } } return isSum[n];}// Driver Codeint main(){ // Given Number n int n = 9; // Function Call if (isSumOfPower(n)) { cout << "true\n"; } else { cout << "false\n"; }} |
Java
// Java program for the above approachimport java.util.*;class GFG{// Function that returns true if n// can be written as a^m+b^nstatic boolean isSumOfPower(int n){ // Taking isSum boolean array // for check the sum exist or not boolean []isSum = new boolean[n + 1]; // To store perfect squares Vector<Integer> perfectPowers = new Vector<Integer>(); perfectPowers.add(1); for(int i = 0; i < (n + 1); i++) { // Initially all sums as false isSum[i] = false; } for(int i = 2; i < (n + 1); i++) { if (isSum[i] == true) { // If sum exist then push // that sum into perfect // square vector perfectPowers.add(i); continue; } for(int j = i * i; j > 0 && j < (n + 1); j *= i) { isSum[j] = true; } } // Mark all perfect powers as false for(int i = 0; i < perfectPowers.size(); i++) { isSum[perfectPowers.get(i)] = false; } // Traverse each perfectPowers for(int i = 0; i < perfectPowers.size(); i++) { for(int j = i; j < perfectPowers.size(); j++) { // Calculating Sum with // perfect powers array int sum = perfectPowers.get(i) + perfectPowers.get(j); if (sum < (n + 1)) isSum[sum] = true; } } return isSum[n];}// Driver Codepublic static void main(String[] args){ // Given number n int n = 9; // Function call if (isSumOfPower(n)) { System.out.print("true\n"); } else { System.out.print("false\n"); }}}// This code is contributed by amal kumar choubey |
Python3
# Python3 program for the above approach# Function that returns true if n# can be written as a^m+b^ndef isSumOfPower(n): # Taking isSum boolean array # for check the sum exist or not isSum = [0] * (n + 1) # To store perfect squares perfectPowers = [] perfectPowers.append(1) for i in range(n + 1): # Initially all sums as false isSum[i] = False for i in range(2, n + 1): if (isSum[i] == True): # If sum exist then push # that sum into perfect # square vector perfectPowers.append(i) continue j = i * i while(j > 0 and j < (n + 1)): isSum[j] = True j *= i # Mark all perfect powers as false for i in range(len(perfectPowers)): isSum[perfectPowers[i]] = False # Traverse each perfectPowers for i in range(len(perfectPowers)): for j in range(len(perfectPowers)): # Calculating Sum with # perfect powers array sum = (perfectPowers[i] + perfectPowers[j]) if (sum < (n + 1)): isSum[sum] = True return isSum[n]# Driver Code# Given Number nn = 9# Function callif (isSumOfPower(n)): print("true")else: print("false")# This code is contributed by sanjoy_62 |
C#
// C# program for the above approachusing System;using System.Collections.Generic;class GFG{// Function that returns true if n// can be written as a^m+b^nstatic bool isSumOfPower(int n){ // Taking isSum bool array // for check the sum exist or not bool []isSum = new bool[n + 1]; // To store perfect squares List<int> perfectPowers = new List<int>(); perfectPowers.Add(1); for(int i = 0; i < (n + 1); i++) { // Initially all sums as false isSum[i] = false; } for(int i = 2; i < (n + 1); i++) { if (isSum[i] == true) { // If sum exist then push // that sum into perfect // square vector perfectPowers.Add(i); continue; } for(int j = i * i; j > 0 && j < (n + 1); j *= i) { isSum[j] = true; } } // Mark all perfect powers as false for(int i = 0; i < perfectPowers.Count; i++) { isSum[perfectPowers[i]] = false; } // Traverse each perfectPowers for(int i = 0; i < perfectPowers.Count; i++) { for(int j = i; j < perfectPowers.Count; j++) { // Calculating Sum with // perfect powers array int sum = perfectPowers[i] + perfectPowers[j]; if (sum < (n + 1)) isSum[sum] = true; } } return isSum[n];}// Driver Codepublic static void Main(String[] args){ // Given number n int n = 9; // Function call if (isSumOfPower(n)) { Console.Write("true\n"); } else { Console.Write("false\n"); }}}// This code is contributed by amal kumar choubey |
Javascript
<script>// JavaScript program to implement// the above approach// Function that returns true if n// can be written as a^m+b^nfunction isSumOfPower(n){ // Taking isSum boolean array // for check the sum exist or not let isSum = Array(n+1).fill(0); // To store perfect squares let perfectPowers = []; perfectPowers.push(1); for(let i = 0; i < (n + 1); i++) { // Initially all sums as false isSum[i] = false; } for(let i = 2; i < (n + 1); i++) { if (isSum[i] == true) { // If sum exist then push // that sum into perfect // square vector perfectPowers.push(i); continue; } for(let j = i * i; j > 0 && j < (n + 1); j *= i) { isSum[j] = true; } } // Mark all perfect powers as false for(let i = 0; i < perfectPowers.length; i++) { isSum[perfectPowers[i]] = false; } // Traverse each perfectPowers for(let i = 0; i < perfectPowers.length; i++) { for(let j = i; j < perfectPowers.length; j++) { // Calculating Sum with // perfect powers array let sum = perfectPowers[i] + perfectPowers[j]; if (sum < (n + 1)) isSum[sum] = true; } } return isSum[n];}// Driver Code // Given number n let n = 9; // Function call if (isSumOfPower(n)) { document.write("true\n"); } else { document.write("false\n"); }</script> |
Output:
true
Time Complexity: O(N)
Auxiliary Space: O(N)
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



