Find last two digits of sum of N factorials
Last Updated :
28 Sep, 2022
Given a number N, the task is to find the unit and tens places digit of the first N natural numbers factorials, i.e last two digit of 1!+2!+3!+….N! where N<=10e18.
Examples:
Input: n = 2
Output: 3
Explanation: 1! + 2! = 3, Last two digits are 3
Input: 4
Output: 33
Explanation: 1!+2!+3!+4!=33, Last two digits are 33
Naive Approach: In this approach, simply calculate the factorial of each number and find the sum of these. Finally, get the unit and tens place the digit of the sum. This will take a lot of time and unnecessary calculations.
Efficient Approach: In this approach, only unit’s and ten’s digit of N is to be calculated in the range [1, 10], because:
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8!=40320
9!=362880
10!=3628800
so on.
As 10 != 3628800, and factorial of number greater than 10 have two trailing zeros. So, N>=10 doesn’t contribute in unit and tens place while doing sum.
Therefore,
if (n < 10)
ans = (1 ! + 2 ! +..+ n !) % 100;
else
ans = (1 ! + 2 ! + 3 ! + 4 !+ 5 ! + 6 ! + 7 ! + 8 ! + 9 ! + 10 !) % 100;
Note: We know (1! + 2! + 3! + 4!+…+10!) % 100 = 13
So we always return 13 when n is greater than 9.
Below is the implementation of the above approach.
C++
#include <iostream>
using namespace std;
#define ll long int
int get_last_two_digit( long long int N)
{
if (N <= 10) {
ll ans = 0, fac = 1;
for ( int i = 1; i <= N; i++) {
fac = fac * i;
ans += fac;
}
return ans % 100;
}
else
return 13;
}
int main()
{
long long int N = 1;
for (N = 1; N <= 10; N++)
cout << "For N = " << N
<< " : " << get_last_two_digit(N)
<< endl;
return 0;
}
|
Java
public class AAA {
static int get_last_two_digit( long N)
{
if (N <= 10 ) {
long ans = 0 , fac = 1 ;
for ( int i = 1 ; i <= N; i++) {
fac = fac * i;
ans += fac;
}
return ( int )ans % 100 ;
}
else
return 13 ;
}
public static void main(String[] args) {
long N = 1 ;
for (N = 1 ; N <= 10 ; N++)
System.out.println( "For N = " + N
+ " : " + get_last_two_digit(N));
}
}
|
Python3
def get_last_two_digit(N):
if N < = 10 :
ans = 0
fac = 1
for i in range ( 1 , N + 1 ):
fac = fac * i
ans + = fac
ans = ans % 100
return ans
else :
return 13
N = 1
for N in range ( 1 , 11 ):
print ( "For N = " , N, ": " ,
get_last_two_digit(N), sep = ' ' )
|
C#
using System;
class GFG
{
static int get_last_two_digit( long N)
{
if (N <= 10)
{
long ans = 0, fac = 1;
for ( int i = 1; i <= N; i++)
{
fac = fac * i;
ans += fac;
}
return ( int )ans % 100;
}
else
return 13;
}
public static void Main()
{
long N = 1;
for (N = 1; N <= 10; N++)
Console.WriteLine( "For N = " + N +
" : " + get_last_two_digit(N));
}
}
|
PHP
<?php
function get_last_two_digit( $N )
{
if ( $N <= 10)
{
$ans = 0; $fac = 1;
for ( $i = 1; $i <= $N ; $i ++)
{
$fac = $fac * $i ;
$ans += $fac ;
}
return $ans % 100;
}
else
return 13;
}
$N = 1;
for ( $N = 1; $N <= 10; $N ++)
echo "For N = " . $N . " : " .
get_last_two_digit( $N ) . "\n" ;
|
Javascript
<script>
function get_last_two_digit(N)
{
if (N <= 10) {
let ans = 0, fac = 1;
for (let i = 1; i <= N; i++) {
fac = fac * i;
ans += fac;
}
return ans % 100;
}
else
return 13;
}
let N = 1;
for (N = 1; N <= 10; N++)
document.write( "For N = " + N
+ " : " + get_last_two_digit(N)
+ "<br>" );
</script>
|
Output:
For N = 1 : 1
For N = 2 : 3
For N = 3 : 9
For N = 4 : 33
For N = 5 : 53
For N = 6 : 73
For N = 7 : 13
For N = 8 : 33
For N = 9 : 13
For N = 10 : 13
Time Complexity: O(1), the loop can run for a maximum of 100 times in the worst case.
Auxiliary Space: O(1) as no extra space is used.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...