Count Vowels Permutation

hard dp modular arithmetic

Problem

Count strings of length n made of vowels (a, e, i, o, u) following these rules: 'a' may be followed only by 'e'; 'e' may be followed by 'a' or 'i'; 'i' may not be followed by another 'i'; 'o' may be followed by 'i' or 'u'; 'u' may be followed only by 'a'. Return the count modulo 10^9 + 7.

Inputn = 2
Output10
Valid pairs: ae, ea, ei, ia, ie, io, iu, oi, ou, ua.

def count_vowel_permutation(n):
    MOD = 10**9 + 7
    a, e, i, o, u = 1, 1, 1, 1, 1
    for _ in range(n - 1):
        a, e, i, o, u = (
            (e + i + u) % MOD,
            (a + i) % MOD,
            (e + o) % MOD,
            i % MOD,
            (i + o) % MOD,
        )
    return (a + e + i + o + u) % MOD
function countVowelPermutation(n) {
  const MOD = 1000000007n;
  let a = 1n, e = 1n, i = 1n, o = 1n, u = 1n;
  for (let k = 1; k < n; k++) {
    [a, e, i, o, u] = [
      (e + i + u) % MOD,
      (a + i) % MOD,
      (e + o) % MOD,
      i % MOD,
      (i + o) % MOD,
    ];
  }
  return Number((a + e + i + o + u) % MOD);
}
class Solution {
    public int countVowelPermutation(int n) {
        long MOD = 1_000_000_007L;
        long a = 1, e = 1, i = 1, o = 1, u = 1;
        for (int k = 1; k < n; k++) {
            long na = (e + i + u) % MOD;
            long ne = (a + i) % MOD;
            long ni = (e + o) % MOD;
            long no = i % MOD;
            long nu = (i + o) % MOD;
            a = na; e = ne; i = ni; o = no; u = nu;
        }
        return (int)((a + e + i + o + u) % MOD);
    }
}
int countVowelPermutation(int n) {
    const long long MOD = 1000000007LL;
    long long a = 1, e = 1, i = 1, o = 1, u = 1;
    for (int k = 1; k < n; k++) {
        long long na = (e + i + u) % MOD;
        long long ne = (a + i) % MOD;
        long long ni = (e + o) % MOD;
        long long no = i % MOD;
        long long nu = (i + o) % MOD;
        a = na; e = ne; i = ni; o = no; u = nu;
    }
    return (int)((a + e + i + o + u) % MOD);
}
Time: O(n) Space: O(1)