using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
//using System.Diagnostics;
//using System.Linq;

class inputFile
{
	//変数
	bool b_testMode;
	List<string> list_s_line;
	int i_index;

	//コンストラクタ
	public inputFile()
	{
		//変数初期化
		b_testMode = false;
		list_s_line = new List<string>();
		i_index = 0;

		//ファイル読み込み
		read_file();
	}

	//ファイル読み込み
	void read_file()
	{
		//テストモードの場合のみ
		if (b_testMode == true)
		{
			// StreamReader の新しいインスタンスを生成する
			System.IO.StreamReader cReader =
				new System.IO.StreamReader
				(@"D:\Data\VisualStudio-workspace\paiza\inputFile.txt", Encoding.Default);

			// 読み込みできる文字がなくなるまで繰り返す
			while (cReader.Peek() >= 0)
			{
				// ファイルを 1 行ずつ読み込む
				string s_temp = cReader.ReadLine();
				// 読み込んだものを追加で格納する
				list_s_line.Add(s_temp);
			}

			// cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
			cReader.Close();
		}
	}

	//1行ずつ取得
	public string get()
	{
		//テストモードの場合
		if (b_testMode == true)
		{
			if (i_index >= list_s_line.Count)
			{
				return "";
			}

			return list_s_line[i_index++];
		}
		//本番モードの場合
		else
		{
			string s_temp = Console.ReadLine();
			if(s_temp == null || s_temp == "")
			{
				return "";
			}
			else
			{
				return s_temp;
			}
		}
	}
}

static class DeepCopyUtils
{
	public static object DeepCopy(this object target)
	{

		object result;
		BinaryFormatter b = new BinaryFormatter();

		MemoryStream mem = new MemoryStream();

		try
		{
			b.Serialize(mem, target);
			mem.Position = 0;
			result = b.Deserialize(mem);
		}
		finally
		{
			mem.Close();
		}

		return result;

	}
}

class Program
{
	//クラス変数
	static inputFile input;
	static Param PRM;

	//Main
	static void Main(string[] args)
	{
		//ファイル読み込み
		input = new inputFile();

		//データ作成
		PRM = new Param();

		//実行
		PRM.exec();
	}

	//データ作成
	[Serializable]
	class Param
	{
		//==================================================
		int cl_i_numCnt;
		List<int> cl_list_i_num;
		//==================================================
		public Param()
		{
			//string[] a_s = input.get().Split(' ');
			//string s_result = string.Join(" ", cl_list_i_num);
			//==================================================
			cl_i_numCnt = int.Parse(input.get());

			cl_list_i_num = new List<int>();
			string[] a_s = input.get().Split(' ');
			foreach (string in_s in a_s)
			{
				cl_list_i_num.Add(int.Parse(in_s));
			}
			//==================================================
		}
		public void exec()
		{
			//==================================================
			//書き換えコスト計算(up)
			int i_kakikaeCost_up = get_kakikaeCost(1);
			//書き換えコスト計算(down)
			int i_kakikaeCost_down = get_kakikaeCost(2);

			//小さいほうが答え
			int i_result = 0;
			if(i_kakikaeCost_up <= i_kakikaeCost_down)
			{
				i_result = i_kakikaeCost_up;
			}
			else
			{
				i_result = i_kakikaeCost_down;
			}

			//出力
			//えび君が全てを同じ整数に書き換えるのに必要なコストの総和の最小値を出力せよ。
			Console.WriteLine(i_result);
			//==================================================
		}
		//==================================================
		//書き換えコスト計算
		int get_kakikaeCost(int in_i_mode)
		{
			//書き換え値(平均値upper)
			int i_kakikaeNum = get_kakikaeNum(in_i_mode);

			int i_cost = 0;
			foreach(int in_i in cl_list_i_num)
			{
				//整数xを整数yに書き換えるとき、コストが(x−y)2かかります
				i_cost += (int)Math.Pow(in_i - i_kakikaeNum, 2);
			}

			return i_cost;
		}
		//書き換え値(平均値)
		int get_kakikaeNum(int in_i_mode) //1:up 2:down
		{
			int i_total = 0;
			foreach(int in_i in cl_list_i_num)
			{
				i_total += in_i;
			}

			int i_kakikaeNum = 0;
			if (in_i_mode == 1)
			{
				i_kakikaeNum = (int)Math.Ceiling((decimal)i_total / cl_i_numCnt);
			}
			else if(in_i_mode == 2)
			{
				i_kakikaeNum = (int)Math.Floor((decimal)i_total / cl_i_numCnt);
			}

			return i_kakikaeNum;
		}
		//==================================================
	}
}


Measured memory_bytes: 2776