A digit string is good if the digits (0-indexed) at even indices are even and the digits at odd indices are prime (2
, 3
, 5
, or 7
).
- For example,
"2582"
is good because the digits (2
and8
) at even positions are even and the digits (5
and2
) at odd positions are prime. However,"3245"
is not good because3
is at an even index but is not even.
Given an integer n
, return the total number of good digit strings of length n
. Since the answer may be large, return it modulo 109 + 7
.
A digit string is a string consisting of digits 0
through 9
that may contain leading zeros.
Example 1:
Input: n = 1 Output: 5 Explanation: The good numbers of length 1 are "0", "2", "4", "6", "8".
Example 2:
Input: n = 4 Output: 400
Example 3:
Input: n = 50 Output: 564908303
Constraints:
1 <= n <= 1015
Solution: Fast Power
Easy to see that f(n) = (4 + (n & 1)) * f(n – 1), f(1) = 5
However, since n is huge, we need to rewrite f(n) as 4n/2 * 5(n+1)/2 and use fast power to compute it.
Time complexity: O(logn)
Space complexity: O(1)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Author: Huahua constexpr int kMod = 1e9 + 7; long long modPow(long long base, long long n) { long long ans = 1; while (n) { if (n & 1) ans = (ans * base) % kMod; base = (base * base) % kMod; n >>= 1; } return ans; } class Solution { public: int countGoodNumbers(long long n) { return (modPow(4, n / 2) * modPow(5, (n + 1) / 2)) % kMod; } }; |