Giải thuật toán tính số hoán vị khác nhau

em làm bài trên code learn thì gặp bài này ạ, mong mọi người giúp đỡ:
Hôm nay tại công viên Thủ Lệ, mọi người đang xếp hàng để mua vé vào. Văn là bảo vệ ở đây. Từ chỗ anh ấy đứng có thể nhìn thấy một hàng người với chiều cao khác nhau. Anh ấy nhận ra với N người xếp hàng thì người bán vé chỉ nhìn thấy M người với M ≤ N bởi vì người cao hơn đứng trước đã che người thấp hơn đứng sau. Tìm xem có bao nhiêu hoán vị khác nhau có thể của hàng đợi đó.

Ví dụ

  • Với N = 3, M = 1 , đầu ra là queueInPark(N,M) = 2 .
    Giả sử 3 người (N) có chiều cao khác nhau như sau: 3, 6, 9.
    Người có chiều cao là 9 là người cao nhất và có thể che 2 người vì vậy người bán vé chỉ có thể nhìn thấy 1 người (M).
    Ta có 2 cách sắp xếp: 9-3-6, 9-6-3.

  • Với N = 5, M = 3 , đầu ra là queueInPark(N,M) = 35 .

Đầu vào/Đầu ra

  • [giới hạn thời gian chạy] 1 second
  • [đầu vào] two integers
    số người với chiều cao khác nhau và số người mà người bán vé có thể nhìn thấy. Điều kiện tiền đề:
    1 ≤ m ≤ n ≤ 1000 .
  • [đầu ra] integer
    phần dư kết quả của hàm chia cho 1000000007 (10^9 + 7) .

bên dưới là code của em ạ.:

function queueInPark(n, m){
    if(m == 1 || m == n){
        return (computeFactorial(n - m )); 
    }
    return (computeFactorial(m) * computeFactorial(n - m + 1)) - 1;



    // if(m == 1 || m == n){
    //     return (computeFactorial(n - m )); 
    // }
    // return (computeFactorial(n) * computeFactorial(n - m)) - 1;
    // if(m>n)
    // return 0;
    // if(m==1 || ((n-m)%2) == 0){
    //     return computeFactorial(n-1);
    // }
    // if((n-m) == 1){
    //     return n-1;
    // }
}


function computeFactorial(n) {
   if (n > 0) {

       return n * computeFactorial(n - 1);

   } else {

       return 1;
   }

}

các test case ạ:

test Đầu vào Đầu ra mong muốn
1 3, 1 2
2 5, 3 35
3 4, 2 11
4 6, 6 1
5 8, 7 28
6 9, 1 40320
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?