// eddy1021 //#include #include #include #include #include #include #include #include #include #include using namespace std; typedef double D; typedef long long ll; typedef pair PII; #define mod9 1000000009ll #define mod7 1000000007ll #define INF 1023456789ll #define INF16 10000000000000000ll #define FI first #define SE second #define PB push_back #define MP make_pair #define MT make_tuple #define eps 1e-9 #define SZ(x) (int)(x).size() ll getint(){ ll _x=0,_tmp=1; char _tc=getchar(); while( (_tc<'0'||_tc>'9')&&_tc!='-' ) _tc=getchar(); if( _tc == '-' ) _tc=getchar() , _tmp = -1; while(_tc>='0'&&_tc<='9') _x*=10,_x+=(_tc-'0'),_tc=getchar(); return _x*_tmp; } ll mypow( ll _a , ll _x , ll _mod ){ if( _x == 0 ) return 1ll; ll _tmp = mypow( _a , _x / 2 , _mod ); _tmp = ( _tmp * _tmp ) % _mod; if( _x & 1 ) _tmp = ( _tmp * _a ) % _mod; return _tmp; } bool equal( D _x , D _y ){ return _x > _y - eps && _x < _y + eps; } int __ = 1 , cs; /*********default*********/ #define N 21 int n , x[ N ] , y[ N ]; void build(){ } void init(){ // n = getint(); for( int i = 0 ; i < n ; i ++ ){ x[ i ] = getint(); y[ i ] = getint(); } } int dist( int ti , int tj ){ return ( x[ ti ] - x[ tj ] ) * ( x[ ti ] - x[ tj ] ) + ( y[ ti ] - y[ tj ] ) * ( y[ ti ] - y[ tj ] ); } int ans; bool can( vector vn ){ vector v; for( int i = 0 ; i < SZ( vn ) ; i ++ ) for( int j = i + 1 ; j < SZ( vn ) ; j ++ ) v.PB( dist( vn[ i ] , vn[ j ] ) ); sort( v.begin() , v.end() ); if( SZ( vn ) == 3 ){ for( int i = 1 ; i < 3 ; i ++ ) if( v[ i ] != v[ i - 1 ] ) return false; return true; }else if( SZ( vn ) == 4 ){ for( int i = 0 ; i < 4 ; i ++ ) if( v[ i ] != v[ 0 ] ) return false; for( int i = 4 ; i < 6 ; i ++ ) if( v[ i ] != 2 * v[ 0 ] ) return false; return true; }else if( SZ( vn ) == 5 ){ for( int i = 0 ; i < 5 ; i ++ ) if( v[ i ] != v[ 0 ] ) return false; for( int i = 6 ; i < 10 ; i ++ ) if( v[ i ] != v[ 5 ] ) return false; if( v[ 0 ] == v[ 5 ] ) return false; return true; }else if( SZ( vn ) == 6 ){ for( int i = 0 ; i < 6 ; i ++ ) if( v[ i ] != v[ 0 ] ) return false; for( int i = 6 ; i < 12 ; i ++ ) if( v[ i ] != 3 * v[ 0 ] ) return false; for( int i = 12 ; i < 15 ; i ++ ) if( v[ i ] != 4 * v[ 0 ] ) return false; return true; } return false; } void DFS( int now , vector tv , int got , bool tmp ){ if( got >= 3 && got <= 6 && tmp ){ if( can( tv ) ) ans ++; } if( got == 4 ) return; if( now >= n ) return; if( n - now - 1 + got >= 3 ) DFS( now + 1 , tv , got , false ); tv.PB( now ); DFS( now + 1 , tv , got + 1 , true ); } void solve(){ ans = 0; vector tv; DFS( 0 , tv , 0 , false ); // for( int i = 1 ; i < ( 1 << n ) ; i ++ ) // if( can( i ) ) // ans ++; cout << ans << endl; } int main(){ build(); // __ = getint(); // while( __ -- ){ while( cin >> n ){ init(); solve(); } }