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>
using namespace std;
 
#define REP(i, s) for (int i = 0; i < s; ++i)
#define ALL(v) (v.begin(), v.end())
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
#define int long long 
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T> ostream& operator << (ostream &s, set<T> P)
{ EACH(it, P) { s << "<" << *it << "> "; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P)
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s << endl; }
typedef long long ll;
//ll a[1000010];
long long GCD(long long a, long long b) {
    if (b == 0) return a;
    else return GCD(b, a % b);
}

signed main(){

    ll n,k;
    cin>>n>>k;
    vector<int>a(n);
    ll sum=0;
    
    REP(i,n) cin>>a[i];
    sort(a.begin(),a.end());
    for (int i = 0; i < n; i++)
    {
        sum+=a[i];
    }
   /* if(k>=sum){
        cout<<sum<<endl;
        return 0;
    }*/
   // cerr<<sum<<endl;
    vector<ll>v;
    for (ll i = 1; i*i<=sum ; i++)
    {
        if(sum%i==0){
        v.push_back(i);
        if(i*i!=sum)
        v.push_back(sum/i);
        }
    }
    //これの答えが候補
    sort(v.rbegin(),v.rend());
    for (int i = 0; i < v.size(); i++)
    {
        vector<int>amari;
        for (int j = 0; j < n; j++)
        {
            amari.push_back(a[j]%v[i]);    
        }
        sort(amari.begin(),amari.end());
        
        for (int l = 0; l < amari.size(); l++)
        {
            ll sum=0;
            for (int j = 0; j < l; j++)
            {
                   sum+=amari[j];  
               
            }
       //     cerr<<sum<<"a"<<endl;
            if(sum>k) continue;
            for (int j = l; j < amari.size(); j++)
            {
                    sum-=v[i]-amari[j];
            }
          //  cerr<<sum2<<"b"<<sum<<endl;
            if(sum==0) {
                cout<<v[i]<<endl;
                return 0;
            }
        }
    }
    return 0;
}