Problem:
Score : 500 points

Problem Statement

We have a sequence of N integers: A_1, A_2, \cdots, A_N.

You can perform the following operation between 0 and K times (inclusive):

Choose two integers i and j such that i \neq j, each between 1 and N (inclusive). Add 1 to A_i and -1 to A_j, possibly producing a negative element.

Compute the maximum possible positive integer that divides every element of A after the operations. Here a positive integer x divides an integer y if and only if there exists an integer z such that y = xz.

Constraints

2 \leq N \leq 500

1 \leq A_i \leq 10^6

0 \leq K \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \cdots A_{N-1} A_{N}

Output

Print the maximum possible positive integer that divides every element of A after the operations.

Sample Input 1

2 3
8 20

Sample Output 1

7

7 will divide every element of A if, for example, we perform the following operation:

Choose i = 2, j = 1. A becomes (7, 21).

We cannot reach the situation where 8 or greater integer divides every element of A.

Sample Input 2

2 10
3 5

Sample Output 2

8

Consider performing the following five operations:

Choose i = 2, j = 1. A becomes (2, 6).

Choose i = 2, j = 1. A becomes (1, 7).

Choose i = 2, j = 1. A becomes (0, 8).

Choose i = 2, j = 1. A becomes (-1, 9).

Choose i = 1, j = 2. A becomes (0, 8).

Then, 0 = 8 \times 0 and 8 = 8 \times 1, so 8 divides every element of A. We cannot reach the situation where 9 or greater integer divides every element of A.

Sample Input 3

4 5
10 1 2 22

Sample Output 3

7

Sample Input 4

8 7
1 7 5 6 8 2 6 5

Sample Output 4

5

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define re register
using namespace std;
struct ios{
	template <typename ty> inline ios& operator >> (ty &x)
	{
		register int f=1;x=0;register char c=getchar();
		for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
		for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
		x*=f;return *this;
	}
	template <typename ty>  inline ios& operator << (ty x)
	{
		if(x<0) x=-x,putchar('-');
		if(x>9) *this << x/10;
		putchar(x%10+48);
		return *this;
	}
	inline ios& operator << (char c){putchar(c);return *this;}
}io;
ll n,a[1000],sum,k,fac[1000],tot,b[1000];
inline bool check(ll x)//以x为最大gcd 
{
	for(int i=1;i<=n;i++) b[i] = a[i]%x;//对于每个a[i]找到他的对于x的模数，
	sort(b+1,b+1+n);
	int cnt = 0;
	int l=1,r=n;
	while(l<r)
	{
		
//		int dis = x-b[r];
//		if(b[l] >= dis) cnt += dis,b[l] -= dis,b[r] += dis;
//		else 
//		{
//			cnt += b[l],b[r] += b[l],b[l] -= b[l];
//		}
//		while(b[r]==x) r--;
//		while(b[l]==0) l++;
		int tp = b[l]+b[r];
		if(tp < x)
		{
			cnt += b[l];
			b[r] += b[l];
			b[l] = 0;
			++l;
		}
		else
		{
			cnt += x-b[r];
			b[r] = x;
			--r;
			b[l] = tp - x;//br+bl == tp
			if(b[l]==0) ++l;
		}
	}
//	for(int i=1;i<=n;i++) if(b[i]%x!=0) return false;
	return (b[l]%x==0) && (cnt <= k);
}

int main()
{
	io >> n >> k;
	for(int i=1;i<=n;i++) io >> a[i],sum += a[i];
	ll ans = 1;
	for(ll i=1;i*i<=sum;i++)
	{
		if(sum%i==0) 
		{
//			fac[++tot] = i;
//			if(i!=sum/i) fac[++tot] = sum/i;
			if(check(i)) ans = max(ans,i);
			if(check(sum/i)) ans = max(ans,sum/i);
		}
	}
//	sort(fac+1,fac+1+tot);
//	for(int i=tot;i>=1;i--)
//	{
//		if(check(fac[i]))
//		{
//			io << fac[i];
//			return 0;
//		}
//	}
	io << ans;
	return 0;
}