import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Northwest {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String line;
        while ((line = br.readLine()) != null && !line.isEmpty()) {
            int townsNo = Integer.parseInt(line);

            HashMap<Integer, Integer> b_plus = new HashMap<>();
            HashMap<Integer, Integer> b_minus = new HashMap<>();

            for (int i = 0; i < townsNo; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());

                int pos = y - x;
                int neg = y + x;

                if (b_plus.containsKey(pos)){
                    b_plus.put(pos, b_plus.get(pos) + 1);
                } else {
                    b_plus.put(pos, 1);
                }

                if (b_minus.containsKey(neg)){
                    b_minus.put(neg, b_minus.get(neg) + 1);
                } else {
                    b_minus.put(neg, 1);
                }
            }

            double pairs = townsNo * townsNo;
            int winner = 0;

            for (Integer value : b_minus.values()) {
                winner += value * (value - 1);
            }

            for (Integer value : b_plus.values()) {
                winner += value * (value - 1);
            }

            System.out.printf("%.6f\n", winner/pairs);
        }
    }
}
