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: Wrong Answer)

#include <bits/stdc++.h>
#define l_ength size
const int inf = (1<<30);
const int mod = 1000000007;
using ll = long long;
using namespace std;

// благодаря: https://twitter.com/heno_code/status/1158014007363510272

int n, k, m;
vector<int> a;

bool possible( int d ){
	vector<int> b(a);
	for( auto &x : b ) x %= d;
	sort( b.begin(), b.end() );
	vector<int> sum(n+1);
	sum[0] = 0;
	for( int i = 0; i < n; ++i ){
		sum[i+1] = sum[i] + b[i];
	}
	int res = inf;
	for( int l = 0; l <= n; ++l ){
		if( d*(n-l) - (sum[n]-sum[l]) == sum[l] ){
			res = min(res, sum[l]);
		} 
	}
	return ( k >= res );
}

int main(){
	cin >> n >> k;
	int sum = 0;
	for( int i = 0; i < n; ++i ){
		int tmp; cin >> tmp;
		sum += tmp;
		a.push_back(tmp);
	}
	m = *(max_element(a.begin(), a.end()));
	vector<int> dv;
	int sz = 0;
	for( int k = 1; k*k <= sum; ++k ){
		if( sum%k == 0 ){
			dv.push_back(k);
			++sz;
			if( sum/k != k ){
				dv.push_back( sum/k );
				++sz;
			}
		}
	}
	if( k >= (sum+1)/2 ){
		cout << sum << endl;
		return 0;
	}
	sort( dv.begin(), dv.end() );
	int ok = 0, ng = sz-1; 
	while( ng-ok > 1 ) {
        int mid = ok+(ng-ok)/2;
        if( possible(dv[mid]) ) ok = mid;
        else ng = mid;
    }
	cout << dv[ok] << endl;
	return 0;
}