Skip to content
Related Articles

Related Articles

Calculate MDAS Factorial of given number
  • Difficulty Level : Hard
  • Last Updated : 11 May, 2021

Given an integer N, the task is to find the MDAS factorial.
The general factorial of a no. N is given by:  

Factorial(N) = (N)*(N-1)*(N-2)*(N-3)*(N-4)*(N-5)*(N-6)*(N-7)- – – – – -(3)*(2)*(1).  

In MDAS factorial, instead of simply multiplying the numbers from N to 1, we perform four operations, Multiplication(*), Divide(/), Addition(+) and Subtraction(-) in a repeating pattern as shown below: 

MDAS_Factorial(N) = (N) * (N-1) / (N-2) + (N-3) – (N-4) – – – – – upto 1.  

By using the integers in decreasing order, we swap the multiplication operations for fixed rotation of operations: multiply (*), divide (/), add (+) and subtract (-) in the above order.
 



Examples: 

Input : N = 4
Output : 7
Explanation : MDAS_Factorial(4) = 4 * 3 / 2 + 1 = 7

Input : N = 10
Output : 12
Explanation : 
MDAS_Factorial(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1 = 12 

Simple Approach: The idea is to use a loop for each cycle of operations (*,/,+,-) and calculate the MDAS Factorial of N. But this may work slow if N is very large. The Time Complexity of this approach is O(N).

Efficient Approach: 
If we observe carefully it can be concluded that: 

  1. If N is less than or equal to 2 then the answer will be N itself.
  2. If N is 3 OR N is 4, the answer is N + 3.
  3. If (N – 4) is completely divisible by 4, the answer is N + 1.
  4. If (N – 4) gives remainder 1 OR 2 while dividing by 4, the answer is N + 2.
  5. For the remaining values, the answer will be N – 1.

Below is the implementation of the above approach 

C++




// C++ Program to find MDAS_Factorial
#include <bits/stdc++.h>
using namespace std;
 
// Program to find MDAS_factorial
int MDAS_Factorial(int N)
{
    if (N <= 2)
        return N;
 
    if (N <= 4)
        return (N + 3);
 
    if ((N - 4) % 4 == 0)
        return (N + 1);
 
    else if ((N - 4) % 4 <= 2)
        return (N + 2);
 
    else
        return (N - 1);
}
 
// Driver code
int main()
{
 
    int N = 4;
    cout << MDAS_Factorial(N) << endl;
    N = 10;
    cout << MDAS_Factorial(N) << endl;
 
    return 0;
}

Java




// Java program find MDAS_Factorial
import java.util.*;
 
class Count {
    public static int MDAS_Factorial(int N)
    {
        if (N <= 2)
            return N;
 
        if (N <= 4)
            return (N + 3);
 
        if ((N - 4) % 4 == 0)
            return (N + 1);
 
        else if ((N - 4) % 4 <= 2)
            return (N + 2);
 
        else
            return (N - 1);
    }
 
    public static void main(String[] args)
    {
        int N = 4;
        System.out.println(MDAS_Factorial(N));
 
        N = 10;
        System.out.println(MDAS_Factorial(N));
    }
}

Python3




# Python3 code find MDAS_Factorial
def MDAS_Factorial( N ):
     
    if N <= 2:
        return N
 
    if N <= 4:
        return N + 3
         
    if (N - 4) % 4 == 0:
        return N + 1
 
    elif (N - 4) % 4 <= 2:
         return N + 2
 
    else:
         return N - 1
 
# Driver code
N = 4 
print(MDAS_Factorial( N ) )
 
N = 10
print(MDAS_Factorial( N ) )

C#




// C# program to find MDAS_Factorial
using System;
 
class Count {
    public static int MDAS_Factorial(int N)
    {
        if (N <= 2)
            return N;
 
        if (N <= 4)
            return (N + 3);
 
        if ((N - 4) % 4 == 0)
            return (N + 1);
 
        else if ((N - 4) % 4 <= 2)
            return (N + 2);
 
        else
            return (N - 1);
    }
 
    // Driver code
    public static void Main()
    {
        int N = 4;
        Console.WriteLine(MDAS_Factorial(N));
 
        N = 10;
        Console.WriteLine(MDAS_Factorial(N));
    }
}

PHP




<?php
// PHP Program
// Program to find MDAS_factorial
function MDAS_Factorial($N)
{
    if ($N <= 2)
          return N;
 
    if ($N <= 4)
          return ($N + 3);
 
    if (($N - 4) % 4 == 0)
          return ($N + 1);
 
    else if (($N - 4) % 4 <= 2)
          return ($N + 2);
 
    else
          return ($N - 1);
}
 
// Driver code
$N  = 4;
echo MDAS_Factorial($N);
echo("\n");
$N  = 10;
echo MDAS_Factorial($N);
?>

Javascript




// Javascript Program
// Program to find MDAS_factorial
function MDAS_Factorial(N)
{
    if (N <= 2)
        return N;
 
    if (N <= 4)
        return (N + 3);
 
    if ((N - 4) % 4 == 0)
        return (N + 1);
 
    else if ((N - 4) % 4 <= 2)
        return (N + 2);
 
    else
        return (N - 1);
}
 
// Driver code
let N = 4;
document.write(MDAS_Factorial(N) + "<br>")
N = 10;
document.write(MDAS_Factorial(N));
 
// This code is contributed by gfgking

Output: 

7
12

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

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :