← Home
package main

import (
	"fmt"
	"math/big"
)

func max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}

func main() {
	var n int
	fmt.Scan(&n)
	var L [5]int
	var R [5]int
	for i := 0; i < n; i++ {
		fmt.Scan(&L[i], &R[i])
	}
	var ss [5]int64
	var T big.Int
	T.SetInt64(1)
	for i := 0; i < n; i++ {
		ss[i] = int64(R[i] - L[i] + 1)
		t := big.NewInt(ss[i])
		T.Mul(&T, t)
	}
	var total big.Int
	for v := 1; v <= 10000; v++ {
		var a [5]int64
		var b [5]int64
		for i := 0; i < n; i++ {
			low := max(int64(v), int64(L[i]))
			if low > int64(R[i]) {
				a[i] = 0
			} else {
				a[i] = int64(R[i]) - low + 1
			}
			b[i] = ss[i] - a[i]
		}
		var prodB big.Int
		prodB.SetInt64(1)
		for i := 0; i < n; i++ {
			prodB.Mul(&prodB, big.NewInt(b[i]))
		}
		var sumTerm big.Int
		for j := 0; j < n; j++ {
			var prodEx big.Int
			prodEx.SetInt64(1)
			for i := 0; i < n; i++ {
				if i != j {
					prodEx.Mul(&prodEx, big.NewInt(b[i]))
				}
			}
			var term big.Int
			term.Mul(big.NewInt(a[j]), &prodEx)
			sumTerm.Add(&sumTerm, &term)
		}
		var inner big.Int
		inner.Set(&T)
		inner.Sub(&inner, &prodB)
		inner.Sub(&inner, &sumTerm)
		total.Add(&total, &inner)
	}
	rat := new(big.Rat)
	rat.SetFrac(&total, &T)
	f, _ := rat.Float64()
	fmt.Printf("%.12f\n", f)
}