Leetcode: 920. Number of Music Playlists

Problem Statement

class Solution:
    def numMusicPlaylists(self, n: int, goal: int, k: int) -> int:
        MOD = 10**9 + 7

        @cache
        def dfs(i, u):
            if i == goal:
                return 1 if u == n else 0
            return ((n - u) * dfs(i + 1, u + 1) + max(u - k, 0) * dfs(i + 1, u)) % MOD

        return dfs(0, 0)