class Solution:
def countGoodNumbers(self, n: int) -> int:
MOD = 10**9 + 7
def mod_pow(a, b):
result = 1
a = a % MOD
while b > 0:
if b % 2 == 1:
result = (result * a) % MOD
a = (a * a) % MOD
b //= 2
return result
even_positions = (n + 1) // 2
odd_positions = n // 2
return (mod_pow(5, even_positions) * mod_pow(4, odd_positions)) % MOD
class Solution {
public:
static constexpr int MOD = 1e9 + 7;
long long mod_pow(long long a, long long b) {
long long result = 1;
a %= MOD;
while (b > 0) {
if (b % 2 == 1)
result = (result * a) % MOD;
a = (a * a) % MOD;
b /= 2;
}
return result;
}
int countGoodNumbers(long long n) {
long long even_positions = (n + 1) / 2;
long long odd_positions = n / 2;
return (int)((mod_pow(5, even_positions) * mod_pow(4, odd_positions)) % MOD);
}
};
class Solution {
static final int MOD = 1_000_000_007;
private long modPow(long a, long b) {
long result = 1;
a %= MOD;
while (b > 0) {
if (b % 2 == 1) result = (result * a) % MOD;
a = (a * a) % MOD;
b /= 2;
}
return result;
}
public int countGoodNumbers(long n) {
long evenPositions = (n + 1) / 2;
long oddPositions = n / 2;
long res = (modPow(5, evenPositions) * modPow(4, oddPositions)) % MOD;
return (int) res;
}
}
var countGoodNumbers = function(n) {
const MOD = 1e9 + 7;
function modPow(a, b) {
let result = 1n;
a = BigInt(a % MOD);
b = BigInt(b);
let mod = BigInt(MOD);
while (b > 0) {
if (b % 2n === 1n) result = (result * a) % mod;
a = (a * a) % mod;
b = b / 2n;
}
return result;
}
let evenPositions = Math.floor((n + 1) / 2);
let oddPositions = Math.floor(n / 2);
let res = (modPow(5, evenPositions) * modPow(4, oddPositions)) % BigInt(MOD);
return Number(res);
};
n
, a "good" number is defined as a digit string of length n
where:
0, 2, 4, 6, 8
).2, 3, 5, 7
).n
, modulo 10^9 + 7
.
1 <= n <= 1015
n
.n
as large as 1015
, this is computationally impossible.
5even\_positions
* 4odd\_positions
. The challenge is to compute this efficiently for very large exponents.
(n + 1) // 2
(since 0 is even, so for n=5, positions 0,2,4 are even)n // 2
5even\_positions * 4odd\_positions
.ab mod m
efficiently in O(log b)
time.10^9 + 7
:
n = 4
:
52 * 42 = 25 * 16 = 400
O(9^n)
or worse, since you would try all digit strings of length n
. This is not feasible for large n
.O(1)
O(log n)
for each call (we call it twice, for 5 and 4).O(log n)
O(1)
(only a few integer variables used)