#include<stdio.h> #include<string.h> #include<algorithm> #include<assert.h> using namespace std; int T,n,k,A[31],C[31],mul[302]; double fact[40],total[32][302]; double solve(int x,int y) { memset(mul,0,sizeof(mul)); int c = max(A[x]-k,0) + max(A[y]-k,0),ck=A[x]+1,sk=A[x]+A[y]; int rem; for(int i=0;i<=k-1;i++){ mul[i] = 0; for(int j=1;j<=A[x];j++) if( j + k >= ck+i && j+k <= sk+i ) mul[i]++; } double answer=0,cases; memset(total,0,sizeof(total)); total[0][0]=1; for(int i=1;i<=n;i++){ if( i==x || i==y) continue; for(int l=n-3;l>=0;l--){ for(int j=k-1;j>=0;j--){ if(j+A[i]>=k) continue; total[l+1][j+A[i]] += total[l][j]; } } } for(int i=0;i<=n-2;i++){ rem = n-i-2; for(int j=0;j<=k-1;j++){ answer = answer + (double)(rem+1)*fact[rem]*fact[i]*(double)total[i][j]*(double)mul[j]; } } return answer ; } int main() { double answer; fact[0]=1; for(int i=1;i<=30;i++) fact[i]=fact[i-1]*i; scanf("%d",&T); while(T--){ answer=0; scanf("%d%d",&n,&k); assert(n<=20); assert(k<=200 && k>=1); for(int i=1;i<=n;i++){ scanf("%d%d",&A[i],&C[i]); assert(A[i]<=10 && A[i]>=1); assert(C[i]<=n && C[i]>=1); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) continue; if(C[i] != C[j]) continue; answer+=solve(i,j); } } for(int i=1;i<=n;i++){ answer = answer + max(A[i]-k,0)*(double)n*fact[n-1]; } printf("%lf\n",answer/fact[n]); } return 0; }