Cod sursa(job #1615462)

Utilizator xtreme77Patrick Sava xtreme77 Data 26 februarie 2016 16:36:48
Problema Patrate 3 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <algorithm>

using namespace std;

# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )

const int MAX = 1e3 + 14 ;

ifstream cin ( "patrate3.in" ) ;
ofstream cout ( "patrate3.out" ) ;

pair < double , double > a [ MAX ] ;

struct muie {
    double len ;
    double x , y ;
};

muie q [ MAX * MAX ] ;
long long pl[MAX * MAX];

struct cmp {
    inline bool operator () ( long long a , long long b )
    {
        return a < b;
    }
};

long long func(double A, int c) {
    double frac = A * (sqrt(5)-1)*0.5;
    frac -= floor(A * (sqrt(5)-1)*0.5);
    frac *= c;
    return (long long)frac ;
}

int main()
{
    int t = 1 ;
    while ( t -- ){
    int n ;
    cin >> n ;
    FORN ( i , 1 , n )
    {
        cin >> a [ i ].first >> a [ i ].second ;
    }
    const double A = (sqrt(5) - 1) / 2;
    int cate = 0 ;
    FORN ( i , 1 , n )
    {
        FORN ( j , 1 , i - 1 )
        {
            ++ cate ;
            q [ cate ].x = ( a [ i ].first + a [ j ].first ) ;
            q [ cate ].y = ( a [ i ].second + a [ j ].second ) ;
            q [ cate ].len = ( a [ i ].first - a [ j ].first ) * ( a [ i ].first - a [ j ].first ) +
                             ( a [ i ].second - a [ j ].second ) * ( a [ i ].second - a [ j ].second ) ;
            long long nr = func(q[cate].x, 696969);
            nr += func(q[cate].y, 666777);
            nr += func(q[cate].len, 232004);
            pl[cate] = nr;
        }
    }
    sort ( pl + 1 , pl + cate + 1 , cmp ()) ;
    long long ans = 0 ;
    long long len = 0 ;
    FORN ( i , 1 , cate )
    {
        int j = i ;
        while ( j <= cate and pl[j] == pl[i]) ++j;
        len = j - i ;
        i = j - 1 ;
        ans = ans + len * ( len - 1 ) / 2 ;
    }
    cout << ans << "\n";
    }
    return 0 ;
}