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 rep(i, n) for (int i = 0; i < (n); ++i)
using  namespace std;
typedef pair<int, int> P;
int n, k;
vector<int> divisor;
vector<P> pri;

void cal_div(int sum, int id) {
  if (id == n) return divisor.push_back(sum);
  cal_div(sum, id + 1);
  for (int i = 0; i < pri[id].second; ++i) {
    sum *= pri[id].first;
    cal_div(sum, id + 1);
  }
}

void cal_pri(int m) {
  for (int i = 2; i*i <= m; ++i) {
    if (m % i == 0) {
      int cnt = 0;
      while (m % i == 0) {
        ++cnt;
        m /= i;
      }
      pri.push_back(make_pair(i, cnt));
    }
  }
  if (m > 1) pri.push_back(make_pair(m, 1));
}

bool cal(int tmax, vector<int> a) {
  rep(i, n) a[i] %= tmax;
  sort(a.begin(), a.end());
  int m = accumulate(a.begin(), a.end(), 0) / tmax;

  return accumulate(a.begin(), a.begin()+n-m, 0) <= k;
}

int main() {
  cin >> n >> k;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  int sum = accumulate(a.begin(), a.end(), 0);
  cal_pri(sum);
  cal_div(1,0);
  sort(divisor.begin(), divisor.end(), greater<int>() );
  for (int i : divisor)  {
    if (cal(i, a)) {
      cout << i << endl;
      break;
    }
  }
  return 0;
}