Count Numbers with Unique Digits

medium math combinatorics

Problem

Count all numbers in [0, 10^n) whose digits are all distinct.

Inputn = 2
Output91
100 total values minus 9 two-digit numbers with repeats (11, 22, …, 99).

def count_numbers_with_unique_digits(n):
    if n == 0:
        return 1
    total = 10
    block = 9
    avail = 9
    for _ in range(2, n + 1):
        block *= avail
        total += block
        avail -= 1
    return total
function countNumbersWithUniqueDigits(n) {
  if (n === 0) return 1;
  let total = 10, block = 9, avail = 9;
  for (let k = 2; k <= n; k++) {
    block *= avail;
    total += block;
    avail--;
  }
  return total;
}
class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        if (n == 0) return 1;
        int total = 10, block = 9, avail = 9;
        for (int k = 2; k <= n; k++) {
            block *= avail;
            total += block;
            avail--;
        }
        return total;
    }
}
int countNumbersWithUniqueDigits(int n) {
    if (n == 0) return 1;
    int total = 10, block = 9, avail = 9;
    for (int k = 2; k <= n; k++) {
        block *= avail;
        total += block;
        avail--;
    }
    return total;
}
Time: O(n) Space: O(1)