#include #include int main() { long n; while (scanf("%ld",&n) == 1) { std::map ne; std::map nw; long aligned = 0; for (long i = 0; i < n; i++) { long x,y; scanf("%ld %ld",&x, &y); long ne_key = y - x; if (ne.find(ne_key) != ne.end()) { ne[ne_key]++; } else { ne[ne_key] = 1; } long nw_key = y + x; if (nw.find(nw_key) != nw.end()) { nw[nw_key]++; } else { nw[nw_key] = 1; } } for (std::_Rb_tree_iterator > it = ne.begin(); it != ne.end(); ++it) { long in_line = it->second; aligned += (in_line) * (in_line - 1); } for (std::_Rb_tree_iterator > it = nw.begin(); it != nw.end(); ++it) { long in_line = it->second; aligned += (in_line) * (in_line - 1); } long total = n * n; printf("%.6lf\n",(double)aligned/(double)total); } return 0; }