#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
//首先看到题目,可变参数只有两个 i和k;所以需要二维dp数组来表示其最优解;
//但是最优解的过程往往是通过子问题的最优解递推得出,所以找出特殊位置初始化很重要;
//但是往往动态规划问题都可以使用递归解决,既然存在递归那么必然存在状态转换式,而且递归的终止条件
//便是我们的特殊位置;
//有了初始条件和状态转换式问题就迎刃而解;
//dp[rest][cur] 表示在当前位置上还剩余多少步;
//当dp[0][p] = 1 因为个时候满足条件,前面的尝试有效;
//由状态转换式可以出本题只需要一维数组就可以实现;故采用空间压缩;
int main(){
int N,M,K,P;
int mod = 1000000007;
while(cin >> N >> M >> K >> P){
//vector<vector<int>> dp(K + 1,vector<int>(N + 1,0));
vector<int> dp(N + 1,0);
dp[P] = 1;
for(int i = 1; i <= K; ++i){
//代表左上角的值
int leftup = dp[1];
for(int j = 1; j <= N; ++j){
//如果cur = 1,说明此时只能向右走一步,此时位置为2;
//此时必须将当前的dp[j]保存,因为我们后边的值要依赖上一行的值;
int tmp = dp[j];
if(j == 1){
//此时dp[j + 1]还是上一行的值
dp[j] = dp[j + 1]%mod;
}else if(j == N){
//如果cur = N,说明此时只能向左走一步,此时位置为 N-1;
//此时需要的上一行左边的值所以我们已经保存了它;
dp[j] = leftup%mod;
}else{
//此时cur处于普遍位置,既可以向左也可以向右
//j + 1的位置直接就是上一行的值,leftup就是上一行左边的值
dp[j] = (dp[j + 1] + leftup)%mod;
}
leftup = tmp;
}
}
cout << dp[M]%mod << endl;
}
return 0;
}