Sum of all N-digit palindromic numbers which doesn’t contains 0 and are divisible by 9
Last Updated :
19 Sep, 2022
Given a number N, the task is to find the sum of all N-digit palindromic numbers which are divisible by 9 and the number doesn’t contain 0 in it.
Note: The sum can be very large, take modulo with 109+7.
Example:
Input: N = 2
Output: 99
Explanation:
There is only one 2-digit palindromic number divisible by 9 is 99.
Input: N = 3
Output: 4995
Naive Approach: The idea is to iterate over all the N-digit numbers and check whether the numbers are palindromic and divisible by 9 and doesn’t contain zero in it. If yes then the summation of all the numbers given the required result.
Efficient Approach: Below are the some observation for this problem statement:
- If N is odd, then the number can be of the form “ab..x..ba” and if N is even then the number can be “ab..xx..ba”, where ‘a’, ‘b’ and ‘x’ can be replaced by digit from 1 to 9.
- If number “ab..x..ba” divisible by 9, (2*(a+b) + x) must be divisible by 9.
- For every possible pair of (a, b) there always exist one such ‘x’ so that the number is divisible by 9.
- Then the count of N-digit palindromic numbers which are divisible by 9 can be calculated from below formula:
Since we have 9 digits to fill at the position a and b.
Therefore, total possible combinations will be:
if N is Odd then, count = pow(9, N/2)
if N is Even then, count = pow(9, N/2 - 1)
as N/2 digits are repeated at the end to get the
number palindromic.
Proof of Uniqueness of ‘x’:
- Minimum value of a and b is 1, therefore minimum sum = 2.
- Maximum value of a and b is 9, therefore minimum sum = 18.
- As the numbers are palindromic, then the sum is given by:
sum = 2*(a+b) + x;
- 2*(a+b) will be of the form 2, 4, 6, 8, …, 36. To make sum divisible by 9 the value of x can be:
sum one of the possible value of x sum + x
2 7 9
4 5 9
6 3 9
8 1 9
. . .
. . .
. . .
36 9 45
Below are the steps:
- After the above observations, the sum of the digit of all N-digit palindromic number which is divisible by 9 at any kth position is given by:
sum at kth position = 45*(number of combinations)/9
- Iterate a loop over [1, N] and find the number of possible combination to placed a digit at current index.
- Find the sum of all the digits at current digit using the above mentioned formula.
- The summation of all the sum calculated at each iteration given the required result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
long long int MOD = 1000000007;
long long int power( long long int a,
long long int b)
{
if (b == 0)
return 1;
long long int temp = power(a, b / 2);
temp = (temp * temp) % MOD;
if (b % 2 != 0) {
temp = (temp * a) % MOD;
}
return temp;
}
void palindromicSum( int N)
{
long long int sum = 0, res, ways;
if (N == 1) {
cout << "9" << endl;
return ;
}
if (N == 2) {
cout << "99" << endl;
return ;
}
ways = N / 2;
if (N % 2 == 0)
ways--;
res = power(9, ways - 1);
for ( int i = 0; i < N; i++) {
sum = sum * 10 + 45 * res;
sum %= MOD;
}
cout << sum << endl;
}
int main()
{
int N = 3;
palindromicSum(N);
return 0;
}
|
Java
class GFG{
static int MOD = 1000000007 ;
static int power( int a, int b)
{
if (b == 0 )
return 1 ;
int temp = power(a, b / 2 );
temp = (temp * temp) % MOD;
if (b % 2 != 0 )
{
temp = (temp * a) % MOD;
}
return temp;
}
static void palindromicSum( int N)
{
int sum = 0 , res, ways;
if (N == 1 )
{
System.out.print( "9" + "\n" );
return ;
}
if (N == 2 )
{
System.out.print( "99" + "\n" );
return ;
}
ways = N / 2 ;
if (N % 2 == 0 )
ways--;
res = power( 9 , ways - 1 );
for ( int i = 0 ; i < N; i++)
{
sum = sum * 10 + 45 * res;
sum %= MOD;
}
System.out.print(sum + "\n" );
}
public static void main(String[] args)
{
int N = 3 ;
palindromicSum(N);
}
}
|
Python3
MOD = 1000000007
def power(a, b):
if (b = = 0 ):
return 1
temp = power(a, b / / 2 )
temp = (temp * temp) % MOD
if (b % 2 ! = 0 ):
temp = (temp * a) % MOD
return temp
def palindromicSum(N):
sum = 0
if (N = = 1 ):
print ( "9" )
return
if (N = = 2 ):
print ( "99" )
return
ways = N / / 2
if (N % 2 = = 0 ):
ways - = 1
res = power( 9 , ways - 1 )
for i in range (N):
sum = sum * 10 + 45 * res
sum % = MOD
print ( sum )
if __name__ = = "__main__" :
N = 3
palindromicSum(N)
|
C#
using System;
class GFG{
static int MOD = 1000000007;
static int power( int a, int b)
{
if (b == 0)
return 1;
int temp = power(a, b / 2);
temp = (temp * temp) % MOD;
if (b % 2 != 0)
{
temp = (temp * a) % MOD;
}
return temp;
}
static void palindromicSum( int N)
{
int sum = 0, res, ways;
if (N == 1)
{
Console.Write( "9" + "\n" );
return ;
}
if (N == 2)
{
Console.Write( "99" + "\n" );
return ;
}
ways = N / 2;
if (N % 2 == 0)
ways--;
res = power(9, ways - 1);
for ( int i = 0; i < N; i++)
{
sum = sum * 10 + 45 * res;
sum %= MOD;
}
Console.Write(sum + "\n" );
}
public static void Main(String[] args)
{
int N = 3;
palindromicSum(N);
}
}
|
Javascript
<script>
let MOD = 1000000007;
function power(a, b)
{
if (b == 0)
return 1;
let temp = power(a, b / 2);
temp = (temp * temp) % MOD;
if (b % 2 != 0)
{
temp = (temp * a) % MOD;
}
return temp;
}
function palindromicSum(N)
{
let sum = 0, res, ways;
if (N == 1)
{
document.write( "9" + "\n" );
return ;
}
if (N == 2)
{
document.write( "99" + "\n" );
return ;
}
ways = Math.floor(N / 2);
if (N % 2 == 0)
ways--;
res = power(9, ways - 1);
for (let i = 0; i < N; i++)
{
sum = sum * 10 + 45 * res;
sum %= MOD;
}
document.write(sum + "<br/>" );
}
let N = 3;
palindromicSum(N);
</script>
|
Time Complexity: O(N), where N is the given number.
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...