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: Runtime Error)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define PI 3.141592653589793238462643383279


void change(int *x, int *y){
	int z;
	z = *x;
	*x = *y;
	*y = z;
}
int compare_int(const void *a, const void *b){
	return *(int*)a - *(int*)b;
}

int max(int a, int b){
	if(a>=b)	return a;
	else	return b;
}

int gcd(int a, int b)
{
    int c;
    if (a < b) {
        a+=b; b=a-b; a-=b;
    }
    while (b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

int main(void){
	int n,k;
	scanf("%d %d", &n, &k);
	int a[n];
	int sum=0;
	for(int i=0;i<n;i++){
		scanf("%d", &a[i]);
		sum += a[i];
	}
  
	int yaku[3*n];
  for(int i=0;i<3*n;i++){
    yaku[i]=0;
  }
	int yakunum=0;
	for(int i=1;i<=sqrt(sum);i++){
       //printf("s%d\n", a[0]);
		if(sum%i==0){
           //printf("1 %d yakunum:%d i:%d\n", a[0], yakunum, i);
			yaku[yakunum]=i;
           //printf("2 %d yakunum:%d i:%d yaku:%d\n", a[0], yakunum, i, yaku[yakunum]);
          	yakunum++;
           //printf("3 %d\n", a[0]);
			if(i!=sqrt(n)){
              yaku[yakunum]=sum/i;
				yakunum++;
              //printf("few%d\n", a[0]);
            }
          //printf("ferub\n");
        }
	}
	 //printf("1 %d\n", a[0]);
	qsort(yaku, yakunum, sizeof(int), compare_int);
	
	int b[n];
	int bignum=n-1;
	int ans=0;
	int ANS;
	// printf("%d %d\n", yaku[0], yaku[5]);
	for(int i=yakunum-1;i>=0;i--){
		//if(sum/yaku[i]<=n)	continue;
		//else{
			for(int j=0;j<n;j++)	b[j] = a[j] % yaku[i];
			qsort(b, n, sizeof(int), compare_int);
			for(int j=0;j<bignum;j++){
             // printf("%d\n", a[0]);
				while(b[j]!=0){
               //   printf("b");
					if(b[bignum]==yaku[i]){
						bignum--;
					}
                 // printf("b");
					b[bignum]++;
					b[j]--;
					ans++;
				}
			}
			if(ans<=k){
				ANS=yaku[i];
				break;
			}
			ans=0;
			bignum=n-1;
		//}
	}
						
	printf("%d", ANS);
//	printf("%d %d", yaku[0], yaku[3]);
//  	printf("%d", yakunum);
//  printf("\n%d\n", 8%28);
	return 0;
}