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