Count ways to represent an integer as an exponent
Given an integer N, the task is to count the number of ways in which N can be expressed as an exponent, i.e., xy, where x and y are positive integers.
Examples:
Input: N = 64
Output: 4
Explanation: 64 can be expressed as 26, 43, 82 and 641
Input: N = 27
Output: 2
Approach: The idea to solve the given problem is to find the prime factorization of the number N and then, find the number of prime factors of the GCD of exponents of the prime factors of the given number N.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
long long int gcd( long long int a,
long long int b)
{
while (b > 0) {
long long int rem = a % b;
a = b;
b = rem;
}
return a;
}
int countNumberOfWays( long long int n)
{
if (n == 1)
return -1;
long long int g = 0;
int power = 0;
while (n % 2 == 0) {
power++;
n /= 2;
}
g = gcd(g, power);
for ( int i = 3; i <= sqrt (n); i += 2) {
power = 0;
while (n % i == 0) {
power++;
n /= i;
}
g = gcd(g, power);
}
if (n > 2)
g = gcd(g, 1);
int ways = 1;
power = 0;
while (g % 2 == 0) {
g /= 2;
power++;
}
ways *= (power + 1);
for ( int i = 3; i <= sqrt (g); i += 2) {
power = 0;
while (g % i == 0) {
power++;
g /= i;
}
ways *= (power + 1);
}
if (g > 2)
ways *= 2;
return ways;
}
int main()
{
int N = 64;
cout << countNumberOfWays(N);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int gcd( int a,
int b)
{
while (b > 0 ) {
int rem = a % b;
a = b;
b = rem;
}
return a;
}
static int countNumberOfWays( int n)
{
if (n == 1 )
return - 1 ;
int g = 0 ;
int power = 0 ;
while (n % 2 == 0 ) {
power++;
n /= 2 ;
}
g = gcd(g, power);
for ( int i = 3 ; i <= ( int )Math.sqrt(n); i += 2 ) {
power = 0 ;
while (n % i == 0 ) {
power++;
n /= i;
}
g = gcd(g, power);
}
if (n > 2 )
g = gcd(g, 1 );
int ways = 1 ;
power = 0 ;
while (g % 2 == 0 ) {
g /= 2 ;
power++;
}
ways *= (power + 1 );
for ( int i = 3 ; i <= ( int )Math.sqrt(g); i += 2 ) {
power = 0 ;
while (g % i == 0 ) {
power++;
g /= i;
}
ways *= (power + 1 );
}
if (g > 2 )
ways *= 2 ;
return ways;
}
public static void main(String[] args)
{
int N = 64 ;
System.out.print(countNumberOfWays(N));
}
}
|
Python3
import math
def gcd(a, b) :
while (b > 0 ) :
rem = a % b
a = b
b = rem
return a
def countNumberOfWays(n) :
if (n = = 1 ) :
return - 1
g = 0
power = 0
while (n % 2 = = 0 ) :
power + = 1
n / / = 2
g = gcd(g, power)
for i in range ( 3 , int (math. sqrt(g)) + 1 , 2 ):
power = 0
while (n % i = = 0 ) :
power + = 1
n / / = i
g = gcd(g, power)
if (n > 2 ) :
g = gcd(g, 1 )
ways = 1
power = 0
while (g % 2 = = 0 ) :
g / / = 2
power + = 1
ways * = (power + 1 )
for i in range ( 3 , int (math. sqrt(g)) + 1 , 2 ):
power = 0
while (g % i = = 0 ) :
power + = 1
g / = i
ways * = (power + 1 )
if (g > 2 ) :
ways * = 2
return ways
N = 64
print (countNumberOfWays(N))
|
C#
using System;
public class GFG
{
static int gcd( int a,
int b)
{
while (b > 0)
{
int rem = a % b;
a = b;
b = rem;
}
return a;
}
static int countNumberOfWays( int n)
{
if (n == 1)
return -1;
int g = 0;
int power = 0;
while (n % 2 == 0)
{
power++;
n /= 2;
}
g = gcd(g, power);
for ( int i = 3; i <= ( int )Math.Sqrt(n); i += 2)
{
power = 0;
while (n % i == 0)
{
power++;
n /= i;
}
g = gcd(g, power);
}
if (n > 2)
g = gcd(g, 1);
int ways = 1;
power = 0;
while (g % 2 == 0)
{
g /= 2;
power++;
}
ways *= (power + 1);
for ( int i = 3; i <= ( int )Math.Sqrt(g); i += 2)
{
power = 0;
while (g % i == 0)
{
power++;
g /= i;
}
ways *= (power + 1);
}
if (g > 2)
ways *= 2;
return ways;
}
public static void Main(String[] args)
{
int N = 64;
Console.Write(countNumberOfWays(N));
}
}
|
Javascript
<script>
function gcd(a, b)
{
while (b > 0) {
let rem = a % b;
a = b;
b = rem;
}
return a;
}
function countNumberOfWays(n)
{
if (n == 1)
return -1;
let g = 0;
let power = 0;
while (n % 2 == 0) {
power++;
n /= 2;
}
g = gcd(g, power);
for (let i = 3; i <= Math.sqrt(n); i += 2) {
power = 0;
while (n % i == 0) {
power++;
n /= i;
}
g = gcd(g, power);
}
if (n > 2)
g = gcd(g, 1);
let ways = 1;
power = 0;
while (g % 2 == 0) {
g /= 2;
power++;
}
ways *= (power + 1);
for (let i = 3; i <= Math.sqrt(g); i += 2) {
power = 0;
while (g % i == 0) {
power++;
g /= i;
}
ways *= (power + 1);
}
if (g > 2)
ways *= 2;
return ways;
}
let N = 64;
document.write(countNumberOfWays(N));
</script>
|
Time Complexity: O(?N)
Auxiliary Space: O(1)
Last Updated :
11 May, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...