MathGolf, 77 6 bytes
╒x%ª+ε*╙╒x%ε* Without handlingFound a clever way to handle 0! without changing the other test cases. Takes input as \$0!\$ this would have been more impressivek n (reverse order), which helps with implicit popping.
Explanation
╒╙ maximum of rangetwo elements (1pops largest of k and n,n+1) x reversewhich array is n %for every valid case except 0!, where slice1 tois getpushed) every╒ k:th element ª+ range(1,n+1) x extend list with [1] (handles 0!)reverse int/array/string % slice every k:th element ε* reduce list with multiplication