package main import ( "fmt" ) func main() { N, M, K, P := 0, 0, 0, 0 for { n, _ := fmt.Scan(&N, &M, &K, &P) if n == 0 { break } else { fmt.Println(process(N, M, K, P)) } } } func process(n, m, k, p int) int { // if k == 0 { // if m == p { // return 1 // } else { // return 0 // } // } // sum := 0 // if m-1 > 0 { // sum += process(n, m-1, k-1, p) // } // if m+1 <= n { // sum += process(n, m+1, k-1, p) // } // return sum // 时间o(n*k), 空间o(n*k) // dp := make([][]int, k+1) // for i := 0; i < len(dp); i++ { // dp[i] = make([]int, n+1) // } // dp[0][p] = 1 // for i := 1; i <= k; i++ { // for j := 1; j <= n; j++ { // if j-1 > 0 { // dp[i][j] += dp[i-1][j-1] // dp[i][j] = dp[i][j] % (1e9 + 7) // } // if j+1 <= n { // dp[i][j] += dp[i-1][j+1] // dp[i][j] = dp[i][j] % (1e9 + 7) // } // } // } // return dp[k][m] // 时间o(n*k), 空间o(n) dp := make([]int, n+1) dp[p] = 1 prejbefore := 0 for i := 1; i <= k; i++ { for j := 1; j <= n; j++ { add := prejbefore // 更新前保留 prejbefore = dp[j] dp[j] = add if j+1 <= n { dp[j] += dp[j+1] dp[j] = dp[j] % (1e9 + 7) } } } return dp[m] }