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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <math.h>
int q_sort(int d[],int left,int right)
{
	if(left >= right) return 0;
	int pipot = d[(left+right)/2],l = left, r = right,tmp;
	while(l < r){
		while(d[l] < pipot) l++;
		while(d[r] > pipot) r--;
		if(l <= r){
			tmp = d[l]; d[l] = d[r]; d[r] = tmp;
			l++; r--;
		}
	}
	q_sort(d,left,r);
	q_sort(d,l,right);
}
int divisor(int num,int d[])
{
	int i,j=0,c[(int)sqrt(num)],k;
	int castle=0;
	//printf("sqrt %d\n",(int)sqrt(num));
	for(i=1;i<=(int)sqrt(num);i++)
	{
		if(num % i == 0)
		{
			d[j] = i;
			castle++;
			if(i != num / i) c[j] = num/i;
			j++;
			castle++;
		}
	}
	k = j;j--;
	for(i = j; i >= 0; i--){
		d[k] = c[i];
		k++;
	}
	return castle;
}




int kate(int ko_ho,int d[],int K,int N)
{
	int i,j,c[N],w = 0;
	for(i = 0; i < N; i++)
	{
		c[i] = d[i]%ko_ho;
		if(c[i] == 0) w++;
	}
	q_sort(c,0,N-1);
	int plas= 0, mainus=0;
	/*printf("%d\n",ko_ho);
	for(i = 0 ; i < N; i++)
	{
		printf("%d ",c[i]);
	}
	printf("\n");
	*/
	for(i = w; i < N; i++)
	{
		plas = 0; mainus = 0;
		for( j = 0; j < i; j++)
		{
			mainus+=c[j];
		}
		for( j = i ; j < N; j++)
		{
			plas += ko_ho - c[j];
		}
		if(plas==mainus) break;
		//printf("i = %d, plas = %d, mainus = %d\n",i,plas,mainus);
	}
	if(plas <= K) return 1;
	else return 0;
}






int main(void)
{
	int N,K;
	scanf("%d %d",&N,&K);
	int A[N],i,sum=0;
	for(i = 0; i < N ; i++)
	{
		scanf("%d",&A[i]);
		sum += A[i];
	}
	
	int kouho[2*(int)sqrt(sum)],c;
	c = divisor(sum,kouho);
	
	/*
	for(i = 0 ; i < 10; i++)
	{
		printf("ap %d ",kouho[i]);
	}
	printf("\n");
	*/
	int e = 0,r;
	for(i = c-1; i >= 0; i--)
	{
		r = kouho[i];
		e = kate(r,A,K,N);
		if(e == 1) break;
	}
	printf("%d",r);
	//*/
	return 0;
}