using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class ABC
{


    public static void Main()
    {
        var read = Console.ReadLine().Split().Select(long.Parse).ToArray();
        long N = read[0];
        SortedDictionary<string, long> balls = new SortedDictionary<string, long>();
        bool[] collected = new bool[N];
        Tuple<long, long>[] balls_tuple = new Tuple<long, long>[N];
        for (long i = 0; i < N; i++)
        {
            string readline = Console.ReadLine();
            long[] split = readline.Split().Select(long.Parse).ToArray();
            balls[readline] = i;
            balls_tuple[i] = new Tuple<long, long>(split[0], split[1]);
            collected[i] = false;
        }
        long minimum_cost = long.MaxValue;
        if (N == 1)
        {
            Console.WriteLine(1);
            return;
        }
        else
        for (long firstball = 0; firstball < N - 1; firstball++)
        {
            for (long lastball = firstball + 1; lastball < N; lastball++)
            {
                long p = balls_tuple[firstball].Item1 - balls_tuple[lastball].Item1;
                long q = balls_tuple[firstball].Item2 - balls_tuple[lastball].Item2;
                bool[] thisTime_collected = new bool[N];
                collected.CopyTo(thisTime_collected,0);
                long n_collected = 0;
                long cost = 0;
                bool isDAME = false;
                for (long lookingyounger = 0; lookingyounger < N; lookingyounger++)
                {
                    //回収する珠のスタートを選ぶ
                    if (thisTime_collected[lookingyounger] == true) continue;
                    else
                    {
                        cost++;
                        if (cost > minimum_cost)
                        {
                            isDAME = true;
                            break;
                        }


                        long x = balls_tuple[lookingyounger].Item1;
                        long y = balls_tuple[lookingyounger].Item2;
                        thisTime_collected[lookingyounger] = true;
                        n_collected++;
                        while (balls.ContainsKey((longs2key(x - p, y - q))))
                        {
                            long key_nextball = balls[longs2key(x - p, y - q)];
                            thisTime_collected[key_nextball] = true;
                            n_collected++;
                            x -= p;
                            y -= q;

                        }

                            x = balls_tuple[lookingyounger].Item1;
                        y = balls_tuple[lookingyounger].Item2;
                        while (balls.ContainsKey((longs2key(x + p, y + q))))
                        {
                            long key_nextball = balls[longs2key(x + p, y + q)];
                            thisTime_collected[key_nextball] = true;
                            n_collected++;
                            x += p;
                            y += q;
                        }

                    }


                }
                if (isDAME == false)
                {
                    if (minimum_cost > cost)
                    {
                        minimum_cost = cost;
                    }
                }


            }

        }


        Console.WriteLine(minimum_cost);

    }

    public static string longs2key(long x, long y)
    {
        return x + " " + y;
    }

}

Measured memory_bytes: 15956