Check if count of even divisors of N is equal to count of odd divisors

Given a positive integer N, the task is to check whether the count of even divisors and odd divisors of N are equal or not. If they are same then print “YES” else print “NO”.

Examples :

Input: N = 6
Output: YES
Explanation:
Number 6 has four factors:
1, 2, 3, 6,
count of even divisors = 2 (2 and 6)
count of odd divisors = 2 (1 and 3)

Input: N = 9
Output: NO
Explanation:
count of even divisors = 0
count of odd divisors = 3 (1, 3 and 9)

Naive Approach: The naive approach is to find all the divisors of the given number and count the even divisors and odd divisors and check whether they are equal or not. If they are same then print “YES”, else print “NO”.



Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to check if count of even
// and odd divisors are equal
bool divisorsSame(int n)
{
    // To store the count of even
    // factors and odd factors
    int even_div = 0, odd_div = 0;
  
    // Loop till [1, sqrt(N)]
    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
  
            // If divisors are equal
            // add only one
            if (n / i == i) {
  
                // Check for even
                // divisor
                if (i % 2 == 0) {
                    even_div++;
                }
  
                // Odd divisor
                else {
                    odd_div++;
                }
            }
  
            // Check for both divisor
            // i.e., i and N/i
            else {
  
                // Check if i is odd
                // or even
                if (i % 2 == 0) {
                    even_div++;
                }
                else {
                    odd_div++;
                }
  
                // Check if N/i is odd
                // or even
                if (n / i % 2 == 0) {
                    even_div++;
                }
                else {
                    odd_div++;
                }
            }
        }
    }
  
    // Return true if count of even_div
    // and odd_div are equals
    return (even_div == odd_div);
}
  
// Driver Code
int main()
{
    // Given Number
    int N = 6;
  
    // Function Call
    if (divisorsSame(N)) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java code for the above program
import java.util.*;
  
class GFG{
  
// Function to check if count of 
// even and odd divisors are equal
static boolean divisorsSame(int n)
{
      
    // To store the count of even
    // factors and odd factors
    int even_div = 0, odd_div = 0;
  
    // Loop till [1, sqrt(N)]
    for(int i = 1; i <= Math.sqrt(n); i++)
    {
       if (n % i == 0)
       {
             
           // If divisors are equal
           // add only one
           if (n / i == i)
           {
                 
               // Check for even
               // divisor
               if (i % 2 == 0)
               {
                   even_div++;
               }
                 
               // Odd divisor
               else 
               {
                   odd_div++;
               }
           }
             
           // Check for both divisor
           // i.e., i and N/i
           else
           {
                 
               // Check if i is odd
               // or even
               if (i % 2 == 0)
               {
                   even_div++;
               }
               else 
               {
                   odd_div++;
               }
                 
               // Check if N/i is odd
               // or even
               if (n / i % 2 == 0)
               {
                   even_div++;
               }
               else 
               {
                   odd_div++;
               }
           }
       }
    }
      
    // Return true if count of even_div
    // and odd_div are equals
    return (even_div == odd_div);
}
  
// Driver code
public static void main(String[] args)
{
    // Given number
    int N = 6;
  
    // Function call
    if (divisorsSame(N))
    {
        System.out.println("Yes");
    }
    else
    {
        System.out.println("No");
    }
}
}
  
// This code is contributed by offbeat
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
import math
  
# Function to check if count of even
# and odd divisors are equal
def divisorsSame(n):
  
    # To store the count of even
    # factors and odd factors
    even_div = 0; odd_div = 0;
  
    # Loop till [1, sqrt(N)]
    for i in range(1, int(math.sqrt(n))): 
      
        if (n % i == 0):
  
            # If divisors are equal
            # add only one
            if (n // i == i):
  
                # Check for even
                # divisor
                if (i % 2 == 0):
                    even_div += 1;
                  
                # Odd divisor
                else:
                    odd_div += 1;
  
            # Check for both divisor
            # i.e., i and N/i
            else:
  
                # Check if i is odd
                # or even
                if (i % 2 == 0):
                    even_div += 1;
                  
                else:
                    odd_div += 1;
                  
                # Check if N/i is odd
                # or even
                if (n // (i % 2) == 0):
                    even_div += 1;
                  
                else:
                    odd_div += 1;
                  
    # Return true if count of even_div
    # and odd_div are equals
    return (even_div == odd_div);
  
# Driver Code
  
# Given Number
N = 6;
  
# Function Call
if (divisorsSame(N) == 0):
    print("Yes");
  
else:
    print("No");
  
# This code is contributed by Code_Mech
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# code for the above program
using System;
class GFG{
  
// Function to check if count of 
// even and odd divisors are equal
static bool divisorsSame(int n)
{
      
    // To store the count of even
    // factors and odd factors
    int even_div = 0, odd_div = 0;
  
    // Loop till [1, sqrt(N)]
    for(int i = 1; i <= Math.Sqrt(n); i++)
    {
        if (n % i == 0)
        {
                  
            // If divisors are equal
            // add only one
            if (n / i == i)
            {
                      
                // Check for even
                // divisor
                if (i % 2 == 0)
                {
                    even_div++;
                }
                      
                // Odd divisor
                else
                {
                    odd_div++;
                }
            }
                  
            // Check for both divisor
            // i.e., i and N/i
            else
            {
                      
                // Check if i is odd
                // or even
                if (i % 2 == 0)
                {
                    even_div++;
                }
                else
                {
                    odd_div++;
                }
                      
                // Check if N/i is odd
                // or even
                if (n / i % 2 == 0)
                {
                    even_div++;
                }
                else
                {
                    odd_div++;
                }
            }
        }
    }
      
    // Return true if count of even_div
    // and odd_div are equals
    return (even_div == odd_div);
}
  
// Driver code
public static void Main()
{
    // Given number
    int N = 6;
  
    // Function call
    if (divisorsSame(N))
    {
        Console.Write("Yes");
    }
    else
    {
        Console.Write("No");
    }
}
}
  
// This code is contributed by Akanksha_Rai
chevron_right

Output:
Yes

Time Complexity: O(√N), where N is the given number
Auxiliary Space: O(1)

Efficient Approach: The idea is to observe that the numbers whose count of even and odd divisors are equals forms the following Arithmetic Progression:

2, 6, 10, 14, 18, 22, …

  1. The Kth term of the above series is:
  2. Now we have to check whether N is a term of the above series or not by the equation:

    =>
    =>

  3. If the value of K calculated using the above formula is an integer, then N is the number with equal count of even and odd divisors.
  4. Else N is not the number with equal count of even and odd divisors.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to check if count of even
// and odd divisors are equal
bool divisorsSame(int n)
{
  
    // If (n-2)%4 is an integer, then
    // return true else return false
    return (n - 2) % 4 == 0;
}
  
// Driver Code
int main()
{
    // Given Number
    int N = 6;
  
    // Function Call
    if (divisorsSame(N)) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java code for the above program
import java.util.*;
  
class GFG{
      
// Function to check if count of 
// even and odd divisors are equal
static boolean divisorsSame(int n)
{
      
    // If (n-2)%4 is an integer, then
    // return true else return false
    return (n - 2) % 4 == 0;
}
  
// Driver code
public static void main(String[] args)
{
      
    // Given number
    int N = 6;
  
    // Function call
    if (divisorsSame(N))
    {
        System.out.println("Yes");
    }
    else 
    {
        System.out.println("No");
    }
    }
}
  
// This code is contributed by offbeat
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Function to check if count of even
# and odd divisors are equal
def divisorsSame(n):
  
    # If (n-2)%4 is an integer, then
    # return true else return false
    return (n - 2) % 4 == 0;
  
# Driver Code
  
# Given Number
N = 6;
  
# Function Call
if (divisorsSame(N)):
    print("Yes");
else:
    print("No");
  
# This code is contributed by Nidhi_biet
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# code for the above program
using System;
class GFG{
      
// Function to check if count of 
// even and odd divisors are equal
static bool divisorsSame(int n)
{
      
    // If (n-2)%4 is an integer, then
    // return true else return false
    return (n - 2) % 4 == 0;
}
  
// Driver code
public static void Main()
{
      
    // Given number
    int N = 6;
  
    // Function call
    if (divisorsSame(N))
    {
        Console.Write("Yes");
    }
    else
    {
        Console.Write("No");
    }
    }
}
  
// This code is contributed by Code_Mech
chevron_right

Output:
Yes

Time complexity: O(1)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.





Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :