Problem: Training is indispensable for achieving good results at ICPC. Rabbit wants to win at ICPC, so he decided to practice today as well.

Today's training is to use the Amidakuji to improve luck by gaining the ability to read the future. Of course, not only relying on intuition, but also detailed probability calculation is indispensable.

The Amidakuji we consider this time consists of N vertical bars with a length of H + 1 cm. The rabbit looks at the top of the stick and chooses one of the N. At the bottom of the bar, "hit" is written only at the location of the Pth bar from the left. The Amidakuji contains several horizontal bars. Consider the following conditions regarding the arrangement of horizontal bars.

* Each horizontal bar is at a height of a centimeter from the top of the vertical bar, where a is an integer greater than or equal to 1 and less than or equal to H.
* Each horizontal bar connects only two adjacent vertical bars.
* There are no multiple horizontal bars at the same height.



The rabbit drew M horizontal bars to satisfy these conditions. Unfortunately, the rabbit has a good memory, so I remember all the hit positions and the positions of the horizontal bars, so I can't enjoy the Amidakuji. So I decided to have my friend's cat add more horizontal bars.

First, the rabbit chooses one of the N sticks, aiming for a hit. After that, the cat performs the following operations exactly K times.

* Randomly select one of the locations that meet the conditions specified above even if a horizontal bar is added. Here, it is assumed that every place is selected with equal probability. Add a horizontal bar at the selected location.



Then, it is determined whether the stick selected by the rabbit was a hit. The way to follow the bars is the same as the normal Amidakuji (every time you meet a horizontal bar, you move to the next vertical bar). Rabbits want to have a high probability of winning as much as possible.



Input


H N P M K
A1 B1
...
AM BM


In Ai, Bi (1 ≤ i ≤ M), the i-th horizontal bar drawn by the rabbit is at a height of Ai centimeters from the top of the vertical bar, and the second vertical bar from the left and Bi from the left. + An integer that represents connecting the first vertical bar.

2 ≤ H ≤ 500, 2 ≤ N ≤ 100, 1 ≤ P ≤ N, 1 ≤ M ≤ 100, 1 ≤ K ≤ 100, M + K ≤ H, 1 ≤ A1 <A2 <... <AM ≤ H, Satisfy 1 ≤ Bi ≤ N-1.

Output

Output the probability of winning in one line when the rabbit chooses a stick so that the probability of winning is maximized. Absolute errors of 10-6 or less are allowed.

Examples

Input

9 4 3 2 1
2 1
7 3


Output

0.571428571


Input

9 4 3 2 3
2 1
7 3


Output

0.375661376

Solution (in CPP):

Solution:
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>

using namespace std;

#define FOR(i,k,n) for(int i=(k); i<(int)n; ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)

template<class T> void debug(T begin, T end){ for(T i = begin; i != end; ++i) cout<<*i<<" "; cout<<endl; }

typedef long long ll;
const int INF = 100000000;
const double EPS = 1e-8;
const int MOD = 1000000007;

int main(){
  int H, N, P, M, K;
  while(cin>>H>>N>>P>>M>>K){
    double ans = 0;
    int stick[501] = {};
    memset(stick, -1, sizeof(stick));
    REP(i, M){
      int A, B; cin>>A>>B;
      B--;
      stick[A] = B;
    }
    int cnt[501] = {};
    for(int h = 1; h <= 500; h++){
      cnt[h] = cnt[h-1];
      if(stick[h] != -1) cnt[h]++;
    }
    static double dp[501][101][101]; //[h][x][use]
    for(int s = 0; s < N; s++){
      memset(dp, 0, sizeof(dp));
      dp[0][s][0] = 1;
      //printf("start: %d\n", s);
      for(int h = 0; h < H; h++){
        if(stick[h + 1] != -1){
          for(int x = 0; x < N; x++){
            int to = x;
            if(x == stick[h + 1] || x == stick[h + 1] + 1){
              to = (x == stick[h + 1]) ? (x + 1) : (x - 1);
            }
            for(int use = 0; use <= K; use++){
              dp[h + 1][to][use] += dp[h][x][use];
            }
          }
        }else{
          for(int use = 0; use <= K; use++){
            const double P_H = (double)(K - use) / (H - (M - cnt[h + 1]) - h);
            const double P_N = 1.0 / (N - 1);
            if(use != K){
              {
                int x = 0;
                const double P = P_H * P_N;
                const double not_P_N = 1 - P_N;
                dp[h + 1][x + 1][use + 1] += dp[h][x][use] * P;
                dp[h + 1][x][use + 1] += dp[h][x][use] * P_H * not_P_N;
                dp[h + 1][x][use] += dp[h][x][use] * (1 - P_H);
              }
              for(int x = 1; x < N - 1; x++){
                const double P = P_H * P_N;
                double not_P_N = 1 - 2 * P_N;
                dp[h + 1][x - 1][use + 1] += dp[h][x][use] * P;
                dp[h + 1][x + 1][use + 1] += dp[h][x][use] * P;
                dp[h + 1][x][use + 1] += dp[h][x][use] * P_H * not_P_N;
                dp[h + 1][x][use] += dp[h][x][use] * (1 - P_H);
              }
              {
                int x =  N - 1;
                const double P = P_H * P_N;
                const double not_P_N = 1 - P_N;
                dp[h + 1][x - 1][use + 1] += dp[h][x][use] * P;
                dp[h + 1][x][use + 1] += dp[h][x][use] * P_H * not_P_N;
                dp[h + 1][x][use] += dp[h][x][use] * (1 - P_H);
              }
            }else{
              for(int x = 0; x < N; x++) dp[h + 1][x][use] += dp[h][x][use] * (1 - P_H);
            }
          }
        }
        /*
        printf("height: %d\n", h + 1);
        for(int x = 0; x < N; x++){
          for(int use = 0; use <= K; use++){
            printf("  x:%d p:%f use:%d\n", x, dp[h + 1][x][use], use);
          }
        }
        */
      }
      ans = max(ans, dp[H][P-1][K]);
    }
    printf("%.9f\n", ans);
  }
  return 0;
}