Find the Derangement of An Array

medium dp math

Problem

Count derangements of 1..n (permutations with no fixed point), modulo 10^9+7.

Inputn = 3
Output2
Derangements of [1,2,3]: [2,3,1] and [3,1,2].

def find_derangement(n):
    MOD = 10**9 + 7
    a, b = 1, 0
    for k in range(2, n + 1):
        a, b = b, (k - 1) * (a + b) % MOD
    return b
function findDerangement(n) {
  const MOD = 1000000007n;
  let a = 1n, b = 0n;
  for (let k = 2n; k <= BigInt(n); k++) [a, b] = [b, (k - 1n) * (a + b) % MOD];
  return Number(b);
}
int findDerangement(int n) {
    long MOD = 1_000_000_007L, a = 1, b = 0;
    for (int k = 2; k <= n; k++) { long c = (k - 1) * (a + b) % MOD; a = b; b = c; }
    return (int) b;
}
int findDerangement(int n) {
    long MOD = 1e9 + 7, a = 1, b = 0;
    for (int k = 2; k <= n; k++) { long c = (k - 1) * (a + b) % MOD; a = b; b = c; }
    return (int) b;
}
Time: O(n) Space: O(1)