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> |
true
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Find More on that Topic: geeksforgeeks.org/check-if-a-number-can-be-expressed-as-sum-of-two-perfect-powers/ […]