Given an array arr[] consisting of N positive integers, the task is to find the suffix factorials of a suffix sum array of the given array.
Examples:
Input: arr[] = {1, 2, 3, 4}
Output: {3628800, 362880, 5040, 24}
Explanation: The suffix sum of the given array is {10, 9, 7, 4}.
Therefore, suffix factorials of the obtained suffix sum array is {10!, 9!, 7!, 4!}
Input: arr[] = {2, 0}
Output: {2, 1}
Approach: The task can be solved by pre-calculating the factorials of all numbers till the entire sum of the array. So that the factorial calculation at each index of the suffix sum array is can be calculated in unit time.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void suffixFactorialArray( int A[], int N)
{
for ( int i = N - 2; i >= 0; i--) {
A[i] += A[i + 1];
}
int fact[A[0] + 1];
fact[0] = 1;
for ( int i = 1; i <= A[0]; i++) {
fact[i] = i * fact[i - 1];
}
for ( int i = 0; i < N; i++) {
A[i] = fact[A[i]];
}
for ( int i = 0; i < N; i++) {
cout << A[i] << " " ;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4 };
int N = sizeof (arr) / sizeof (arr[0]);
suffixFactorialArray(arr, N);
return 0;
}
|
Java
import java.io.*;
public class GFG
{
static void suffixFactorialArray( int [] A, int N) {
for ( int i = N - 2 ; i >= 0 ; i--) {
A[i] += A[i + 1 ];
}
int [] fact = new int [A[ 0 ] + 1 ];
fact[ 0 ] = 1 ;
for ( int i = 1 ; i <= A[ 0 ]; i++) {
fact[i] = i * fact[i - 1 ];
}
for ( int i = 0 ; i < N; i++) {
A[i] = fact[A[i]];
}
for ( int i = 0 ; i < N; i++) {
System.out.print(A[i] + " " );
}
}
public static void main(String args[]) {
int [] arr = { 1 , 2 , 3 , 4 };
int N = arr.length;
suffixFactorialArray(arr, N);
}
}
|
Python3
def suffixFactorialArray(A, N):
for i in range (N - 2 , - 1 , - 1 ):
A[i] + = A[i + 1 ]
fact = [ 0 for _ in range (A[ 0 ] + 1 )]
fact[ 0 ] = 1
for i in range ( 1 , A[ 0 ] + 1 ):
fact[i] = i * fact[i - 1 ]
for i in range ( 0 , N):
A[i] = fact[A[i]]
for i in range ( 0 , N):
print (A[i], end = " " )
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 , 4 ]
N = len (arr)
suffixFactorialArray(arr, N)
|
C#
using System;
class GFG
{
static void suffixFactorialArray( int []A, int N)
{
for ( int i = N - 2; i >= 0; i--) {
A[i] += A[i + 1];
}
int []fact = new int [A[0] + 1];
fact[0] = 1;
for ( int i = 1; i <= A[0]; i++) {
fact[i] = i * fact[i - 1];
}
for ( int i = 0; i < N; i++) {
A[i] = fact[A[i]];
}
for ( int i = 0; i < N; i++) {
Console.Write(A[i] + " " );
}
}
public static void Main()
{
int []arr = { 1, 2, 3, 4 };
int N = arr.Length;
suffixFactorialArray(arr, N);
}
}
|
Javascript
<script>
function suffixFactorialArray(A, N) {
for (let i = N - 2; i >= 0; i--) {
A[i] += A[i + 1];
}
let fact = new Array(A[0] + 1);
fact[0] = 1;
for (let i = 1; i <= A[0]; i++) {
fact[i] = i * fact[i - 1];
}
for (let i = 0; i < N; i++) {
A[i] = fact[A[i]];
}
for (let i = 0; i < N; i++) {
document.write(A[i] + " " );
}
}
let arr = [1, 2, 3, 4];
let N = arr.length;
suffixFactorialArray(arr, N);
</script>
|
Output3628800 362880 5040 24
Time Complexity: O(N + M), where M is the sum of array elements.
Auxiliary Space: O(M)