#include <bits/stdc++.h>   using namespace std;   double EPS = 1e-9;   int INF = 2000000000;   long long INFF = 8000000000000000000LL;   double PI = acos(-1);   int dirx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};   int diry[8] = {0, 1, -1, 0, -1, 1, -1, 1};   inline string IntToString(int a) {     char x[100];     sprintf(x,  %d , a);     string s = x;     return s;   }   inline int StringToInt(string a) {     char x[100];     int res;     strcpy(x, a.c_str());     sscanf(x,  %d , &res);     return res;   }   inline string GetString(void) {     char x[1000005];     scanf( %s , x);     string s = x;     return s;   }   inline string uppercase(string s) {     int n = (int)s.size();     for (int(i) = (0); (i) < (n); ++(i))       if (s[i] >=  a  && s[i] <=  z ) s[i] = s[i] -  a  +  A ;     return s;   }   inline string lowercase(string s) {     int n = (int)s.size();     for (int(i) = (0); (i) < (n); ++(i))       if (s[i] >=  A  && s[i] <=  Z ) s[i] = s[i] -  A  +  a ;     return s;   }   inline void OPEN(string s) {     freopen((s +  .in ).c_str(),  r , stdin);     freopen((s +  .out ).c_str(),  w , stdout);   }   double prob[10005];   int n;   pair<int, int> data[6];   int main() {     scanf( %d , &n);     for (int(i) = (0); (i) < (n); ++(i))       scanf( %d %d , &data[i].first, &data[i].second);     double risan = 0;     for (int(i) = (0); (i) < (n); ++(i)) {       swap(data[i], data[n - 1]);       int m = n - 1;       for (int(j) = (1); (j) <= (10000); ++(j)) {         prob[j] = 0;         for (int(bit) = (0); (bit) < (1 << m); ++(bit))           if (bit > 0) {             double res = 1;             for (int(k) = (0); (k) < (m); ++(k))               if (bit & (1 << k)) {                 if (data[k].first <= j && j <= data[k].second) {                   res *= 1.0 / (double)(data[k].second - data[k].first + 1);                 } else                   goto hell;               } else {                 if (data[k].first >= j) goto hell;                 int batas = min(data[k].second, j - 1);                 res *= (double)(batas - data[k].first + 1) /                        (double)(data[k].second - data[k].first + 1);               }             prob[j] += res;           hell:;           }       }       for (int(j) = (1); (j) <= (10000); ++(j))         prob[j] = prob[j] * j + prob[j - 1];       swap(data[i], data[n - 1]);       for (int(j) = (data[i].first); (j) <= (data[i].second); ++(j)) {         risan += 1.0 / (double)(data[i].second - data[i].first + 1) * prob[j - 1];       }     }     for (int(j) = (1); (j) <= (10000); ++(j)) {       for (int(bit) = (0); (bit) < (1 << n); ++(bit))         if (__builtin_popcount(bit) > 1) {           double res = j;           for (int(i) = (0); (i) < (n); ++(i))             if (bit & (1 << i)) {               if (data[i].first <= j && j <= data[i].second) {                 res *= 1.0 / (double)(data[i].second - data[i].first + 1);               } else                 goto hell2;             } else {               if (data[i].first >= j) goto hell2;               int batas = min(data[i].second, j - 1);               res *= (double)(batas - data[i].first + 1) /                      (double)(data[i].second - data[i].first + 1);             }           risan += res;         hell2:;         }     }     printf( %.10lf n , risan);     return 0;   }