#include #include using namespace std; int main(int argc, char** argv) { ios::sync_with_stdio(false); int N; while(cin >> N) { vector< pair > points(N); for(int i = 0; i > points[i].first >> points[i].second; } double x = 1, y = 1; vector nw, sw; for(int i = 0; i < N; ++i) { nw.push_back(abs(x*points[i].first + y*points[i].second)); if (points[i].first * x + points[i].second * y > 0) { nw[i] *= -1; } } y = -1; for(int i = 0; i < N; ++i) { sw.push_back(abs(x*points[i].first + y*points[i].second)); if (points[i].first * x + points[i].second * y > 0) { sw[i] *= -1; } } sort(nw.begin(), nw.end()); sort(sw.begin(), sw.end()); // for(int i = 0; i < N; ++i) { // cout << nw[i] << " "; // } cout << endl; // for(int i = 0; i < N; ++i) { // cout << sw[i] << " "; // } cout << endl; double d = nw[0]; vector nwcounts, swcounts; int count = 1; for(int i = 1; i < N; ++i) { if(nw[i] == d) { ++count; } else { nwcounts.push_back(count); count = 1; d = nw[i]; } } nwcounts.push_back(count); count = 1; d = sw[0]; for(int i = 1; i < N; ++i) { if(sw[i] == d) { ++count; } else { swcounts.push_back(count); count = 1; d = sw[i]; } } swcounts.push_back(count); // for(size_t i = 0 ; i < nwcounts.size(); ++i) { // cout << nwcounts[i] << " "; // } cout << endl; // // for(size_t i = 0; i < swcounts.size(); ++i) { // cout << swcounts[i] << " "; // } cout << endl; // double prob = 0; double S; double P = N; // for(int i = 0; i < nwcounts.size(); ++i) { // S = nwcounts[i]; // prob+= ((S*(S-1))/2)/(P*(P-1)); // } // for(int i = 0; i < swcounts.size(); ++i) { // S = swcounts[i]; // prob += ((S*(S-1))/2)/(P*(P-1)); // } double prob = 0; for(size_t i = 0; i < nwcounts.size(); ++i) { prob += (nwcounts[i])*(nwcounts[i]-1); } for(size_t i = 0; i < swcounts.size(); ++i) { prob += swcounts[i] * (swcounts[i]-1); } prob = double(prob) / (double(N)*N); cout << prob << endl; } return 0; }