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

02 Dec, 2021
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 = 5Output: trueExplanation:5 can be expressed as 22+12 
Input: N = 15Output: 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.
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++
Java
Python3
C#
Javascript
// 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 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 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# 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
<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>
true
Time Complexity: O(N)Auxiliary Space: O(N)
Amal Kumar Choubey
sanjoy_62
avijitmondal1998
surinderdawra388
arorakashish0911
Maths
maths-power
Numbers
Greedy
Mathematical
Greedy
Mathematical
Numbers
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Optimal Page Replacement Algorithm
Program for Best Fit algorithm in Memory Management
Program for First Fit algorithm in Memory Management
Bin Packing Problem (Minimize number of used Bins)
Max Flow Problem Introduction
Program for Fibonacci numbers
C++ Data Types
Set in C++ Standard Template Library (STL)
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples