Open In App

Find original array from encrypted array (An array of sums of other elements)

Find original array from a given encrypted array of size n. Encrypted array is obtained by replacing each element of the original array by the sum of the remaining array elements.

Examples : 



Input :  arr[] = {10, 14, 12, 13, 11}
Output : {5, 1, 3, 2, 4}
Original array {5, 1, 3, 2, 4}
Encrypted array is obtained as:
= {1+3+2+4, 5+3+2+4, 5+1+2+4, 5+1+3+4, 5+1+3+2}
= {10, 14, 12, 13, 11}
Each element of original array is replaced by the 
sum of the remaining array elements.  

Input : arr[] = {95, 107, 103, 88, 110, 87}
Output : {23, 11, 15, 30, 8, 31}

Approach is purely based on arithmetic observations which are illustrated below:  

Let n = 4, and
the original array be ori[] = {a, b, c, d}
encrypted array is given as:
arr[] = {b+c+d, a+c+d, a+b+d, a+b+c}

Elements of encrypted array are :
arr[0] = (b+c+d), arr[1] = (a+c+d), 
arr[2] = (a+b+d), arr[3] = (a+b+c)
add up all the elements
sum =  arr[0] + arr[1] + arr[2] + arr[3]
       = (b+c+d) + (a+c+d) + (a+b+d) + (a+b+c)
       = 3(a+b+c+d) 
Sum of elements of ori[] = sum / n-1
                        = sum/3 
                        = (a+b+c+d)
Thus, for a given encrypted array arr[] of size n, the sum of 
the elements of the original array ori[] can be calculated as:
sum =  (arr[0]+arr[1]+....+arr[n-1]) / (n-1)

Then, elements of ori[] are calculated as:
ori[0] = sum - arr[0]
ori[1] = sum - arr[1] 
        .
        .
ori[n-1] = sum - arr[n-1]                      

Below is the implementation of above steps.  






// C++ implementation to find original array
// from the encrypted array
#include <bits/stdc++.h>
using namespace std;
 
// Finds and prints the elements of the original
// array
void findAndPrintOriginalArray(int arr[], int n)
{
    // total sum of elements
    // of encrypted array
    int arr_sum = 0;
    for (int i=0; i<n; i++)
        arr_sum += arr[i];
 
    // total sum of elements
    // of original array
    arr_sum = arr_sum/(n-1);
 
    // calculating and displaying
    // elements of original array
    for (int i=0; i<n; i++)
        cout << (arr_sum - arr[i]) << " ";
}
 
// Driver program to test above
int main()
{
    int arr[] = {10, 14, 12, 13, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    findAndPrintOriginalArray(arr, n);
    return 0;
}




import java.util.*;
 
class GFG {
 
    // Finds and prints the elements of the original
    // array
    static void findAndPrintOriginalArray(int arr[], int n)
    {
       
        // total sum of elements
        // of encrypted array
        int arr_sum = 0;
        for (int i = 0; i < n; i++) {
            arr_sum += arr[i];
        }
 
        // total sum of elements
        // of original array
        arr_sum = arr_sum / (n - 1);
 
        // calculating and displaying
        // elements of original array
        for (int i = 0; i < n; i++) {
            System.out.print(arr_sum - arr[i] + " ");
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 10, 14, 12, 13, 11 };
        int n = arr.length;
        findAndPrintOriginalArray(arr, n);
    }
}
 
// This code is contributed by rj13to.




# Python 3 implementation to find
# original array from the encrypted
# array
 
# Finds and prints the elements of
# the original array
def findAndPrintOriginalArray(arr, n):
 
    # total sum of elements
    # of encrypted array
    arr_sum = 0
    for i in range(0, n):
        arr_sum += arr[i]
 
    # total sum of elements
    # of original array
    arr_sum = int(arr_sum / (n - 1))
 
    # calculating and displaying
    # elements of original array
    for i in range(0, n):
        print((arr_sum - arr[i]),
                       end = " ")
 
# Driver program to test above
arr = [10, 14, 12, 13, 11]
n = len(arr)
findAndPrintOriginalArray(arr, n)
 
# This code is contributed By Smitha




// C# program to find original
// array from the encrypted array
using System;
 
class GFG {
     
    // Finds and prints the elements
    // of the original array
    static void findAndPrintOriginalArray(int []arr,
                                          int n)
    {
         
        // total sum of elements
        // of encrypted array
        int arr_sum = 0;
        for (int i = 0; i < n; i++)
            arr_sum += arr[i];
 
        // total sum of elements
        // of original array
        arr_sum = arr_sum / (n - 1);
 
        // calculating and displaying
        // elements of original array
        for (int i = 0; i < n; i++)
        Console.Write(arr_sum - arr[i] + " ");
    }
 
    // Driver Code
    public static void Main (String[] args)
    {
        int []arr = {10, 14, 12, 13, 11};
        int n =arr.Length;
        findAndPrintOriginalArray(arr, n);
    }
}
 
// This code is contributed by parashar...




<?php
// PHP implementation to find
// original array from the
// encrypted array
 
// Finds and prints the elements
// of the original array
function findAndPrintOriginalArray($arr, $n)
{
    // total sum of elements
    // of encrypted array
    $arr_sum = 0;
    for ( $i = 0; $i < $n; $i++)
        $arr_sum += $arr[$i];
 
    // total sum of elements
    // of original array
    $arr_sum = $arr_sum / ($n - 1);
 
    // calculating and displaying
    // elements of original array
    for ( $i = 0; $i < $n; $i++)
        echo $arr_sum - $arr[$i] , " ";
}
 
// Driver Code
$arr = array(10, 14, 12, 13, 11);
$n = count($arr);
findAndPrintOriginalArray($arr, $n);
 
// This code is contributed by anuj_67.
?>




<script>
    // Javascript program to find original
    // array from the encrypted array
     
    // Finds and prints the elements
    // of the original array
    function findAndPrintOriginalArray(arr, n)
    {
          
        // total sum of elements
        // of encrypted array
        let arr_sum = 0;
        for (let i = 0; i < n; i++)
            arr_sum += arr[i];
  
        // total sum of elements
        // of original array
        arr_sum = parseInt(arr_sum / (n - 1), 10);
  
        // calculating and displaying
        // elements of original array
        for (let i = 0; i < n; i++)
            document.write(arr_sum - arr[i] + " ");
    }
     
    let arr = [10, 14, 12, 13, 11];
    let n =arr.length;
    findAndPrintOriginalArray(arr, n);
     
    // This code is contributed by rameshtravel07.
</script>

Output
5 1 3 2 4 

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


Article Tags :