Suppose there is a stair case with N steps. One can either go step by step, or at each step, one can take a jump of at most N steps. We have to find the number of ways in which we can go to the top floor. The N value may be large we are only interested in the first and the last K digits of number of ways.
So, if the input is like N = 10 k = 2, then the output will be 63 because there are 10 steps, if there are S number of ways in which we can go to the top, then consider S be of the form wxyz.So, summing wx + yz is 63.
To solve this, we will follow these steps −
- N := N - 1
- c := 2 * ceiling of (k + log(N);base10)
- e := N, b := 2, s := 1
- while e > 0, do
- if e is odd, then
- s := the first p-c digit numbers of (s*b) where p is number of digits in s*b
- e := floor of e/2
- b := the first p-c digit numbers of (b*b) where p is number of digits in b*b
- if e is odd, then
- s := first p - k digit number of s, where p is number of digits in s
- r := s + (2^N) mod 10^k
- return r
Example
Let us see the following implementation to get better understanding −
from math import log10,ceil def solve(N,k): N -= 1 c = 2*ceil(k + log10(N)) e = N b = 2 s = 1 while e > 0: if e % 2 == 1: s = int(str(s*b)[:c]) e //=2 b = int(str(b*b)[:c]) s = str(s)[:k] r = int(s) + pow(2, N, 10**k) return r N = 10 k = 2 print(solve(N,k))
Input
10, 2
Output
63