// Original C++ solution (slower):
#define _USE_MATH_DEFINES

#include <bits/stdc++.h>

using namespace std;



//template

#define rep(i,a,b) for(int i=(a);i<(b);i++)

#define rrep(i,a,b) for(int i=(a);i>(b);i--)

#define ALL(v) (v).begin(),(v).end()

typedef long long int ll; typedef pair<ll, ll> P;

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<typename A,size_t N,typename T>void Fill(A(&array)[N],const T &val){fill((T*)array, (T*)(array+N), val);}

const int inf = INT_MAX / 2; const ll INF = LLONG_MAX / 2;

const int mod = 998244353; //1e9+7;

struct Mint {

   int val;

   Mint inv() const {

       int tmp, a = val, b = mod, x = 1, y = 0;

       while(b) tmp = a / b, a -= tmp * b, swap(a, b), x -= tmp * y, swap(x, y);

       return Mint(x);

   }

public:

   Mint() :val(0) {}

   Mint(ll x) :val(x >= 0 ? x % mod : x % mod + mod) {}

   int mtoi() { return this->val; }

   Mint pow(ll t) { Mint res = 1; while(t){if(t&1)res *= *this;*this *= *this;t >>= 1;}return res; }

   Mint& operator+=(const Mint& x) { if ((val += x.val) >= mod) val -= mod; return *this; }

   Mint& operator-=(const Mint& x) { if ((val += mod - x.val) >= mod) val -= mod; return *this; }

   Mint& operator*=(const Mint& x) { val = (ll)val * x.val % mod; return *this; }

   Mint& operator/=(const Mint& x) { return *this *= x.inv(); }

   bool operator==(const Mint& x) const { return val == x.val; }

   bool operator!=(const Mint& x) const { return val != x.val; }

   bool operator<(const Mint& x) const { return val < x.val; }

   bool operator<=(const Mint& x) const { return val <= x.val; }

   bool operator>(const Mint& x) const { return val > x.val; }

   bool operator>=(const Mint& x) const { return val >= x.val; }

   Mint operator+(const Mint& x) const { return Mint(*this) += x; }

   Mint operator-(const Mint& x) const { return Mint(*this) -= x; }

   Mint operator*(const Mint& x) const { return Mint(*this) *= x; }

   Mint operator/(const Mint& x) const { return Mint(*this) /= x; }

};

struct factorial {

   vector<Mint> Fact, Finv;

public:

   factorial(int maxx) {

       Fact.resize(maxx+1,Mint(1)),Finv.resize(maxx+1); rep(i,0,maxx)Fact[i+1]=Fact[i]*Mint(i+1);

       Finv[maxx]=Mint(1)/Fact[maxx]; rrep(i,maxx,0)Finv[i-1]=Finv[i]*Mint(i);

   }

   Mint fact(int n,bool inv) { if(inv) return Finv[n]; else return Fact[n]; }

   Mint nPr(int n,int r) { if(n<0||n<r||r<0) return Mint(0); else return Fact[n]*Finv[n-r]; }

   Mint nCr(int n,int r) { if(n<0||n<r||r<0) return Mint(0); else return Fact[n]*Finv[r]*Finv[n-r]; }

};

//template end



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

bool fl(int x){

   priority_queue<int> pq;

   ll val=0,cnt=0;

   rep(i,0,n){

      int y=(a[i]/x*x+x);

      if(y-a[i]==x)y-=x;

      val+=y-a[i]; cnt+=y-a[i];

      pq.push(y-a[i]);

   }

   int mi=0;

   while(val!=0){

      int v=pq.top(); pq.pop();

      val-=x; cnt-=v;

   }

   return cnt<=k;

}



int main(){

   cin>>n>>k;

   a.resize(n);

   ll sum=0;

   rep(i,0,n)cin>>a[i],sum+=a[i];

   rep(i,1,300010){

      if(sum%i==0){

         di.push_back(i);

         if(sum!=i*i)di.push_back(sum/i);

      }

   }

   sort(ALL(di));

   int ans=0;

   rep(i,0,di.size()){

      if(fl(di[i]))chmax(ans,i);

   }

   printf("%d\n",di[ans]);

   return 0;

}


// Optimized solution to the same problem (faster):
#define _USE_MATH_DEFINES

#include <bits/stdc++.h>

using namespace std;

 

//template

#define rep(i,a,b) for(int i=(a);i<(b);i++)

#define rrep(i,a,b) for(int i=(a);i>(b);i--)

#define ALL(v) (v).begin(),(v).end()

typedef long long int ll; typedef pair<ll, ll> P;

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<typename A,size_t N,typename T>void Fill(A(&array)[N],const T &val){fill((T*)array, (T*)(array+N), val);}

const int inf = INT_MAX / 2; const ll INF = LLONG_MAX / 2;

const int mod = 1e9+7; //998244353;

struct Mint {

  int val;

  Mint inv() const {

      int tmp, a = val, b = mod, x = 1, y = 0;

      while(b) tmp = a / b, a -= tmp * b, swap(a, b), x -= tmp * y, swap(x, y);

      return Mint(x);

  }

public:

  Mint() :val(0) {}

  Mint(ll x) :val(x >= 0 ? x % mod : x % mod + mod) {}

  int mtoi() { return this->val; }

  Mint pow(ll t) { Mint res = 1,b = *this; while(t){if(t&1)res *= b;b *= b;t >>= 1;}return res; }

  Mint& operator+=(const Mint& x) { if ((val += x.val) >= mod) val -= mod; return *this; }

  Mint& operator-=(const Mint& x) { if ((val += mod - x.val) >= mod) val -= mod; return *this; }

  Mint& operator*=(const Mint& x) { val = (ll)val * x.val % mod; return *this; }

  Mint& operator/=(const Mint& x) { return *this *= x.inv(); }

  bool operator==(const Mint& x) const { return val == x.val; }

  bool operator!=(const Mint& x) const { return val != x.val; }

  bool operator<(const Mint& x) const { return val < x.val; }

  bool operator<=(const Mint& x) const { return val <= x.val; }

  bool operator>(const Mint& x) const { return val > x.val; }

  bool operator>=(const Mint& x) const { return val >= x.val; }

  Mint operator+(const Mint& x) const { return Mint(*this) += x; }

  Mint operator-(const Mint& x) const { return Mint(*this) -= x; }

  Mint operator*(const Mint& x) const { return Mint(*this) *= x; }

  Mint operator/(const Mint& x) const { return Mint(*this) /= x; }

};

struct factorial {

  vector<Mint> Fact, Finv;

public:

  factorial(int maxx) {

      Fact.resize(maxx+1,Mint(1)),Finv.resize(maxx+1); rep(i,0,maxx)Fact[i+1]=Fact[i]*Mint(i+1);

      Finv[maxx]=Mint(1)/Fact[maxx]; rrep(i,maxx,0)Finv[i-1]=Finv[i]*Mint(i);

  }

  Mint fact(int n,bool inv) { if(inv) return Finv[n]; else return Fact[n]; }

  Mint nPr(int n,int r) { if(n<0||n<r||r<0) return Mint(0); else return Fact[n]*Finv[n-r]; }

  Mint nCr(int n,int r) { if(n<0||n<r||r<0) return Mint(0); else return Fact[n]*Finv[r]*Finv[n-r]; }

};

//template end





 

int main(){

  int n,k; scanf("%d %d",&n,&k);

  vector<int> a(n);

  rep(i,0,n)scanf("%d",&a[i]);

  ll sum=0;

  rep(i,0,n)sum+=a[i];

  vector<ll> divisor;

  rep(i,1,sqrt(sum)+1){

    if(sum%i==0){

      divisor.push_back(i);

      divisor.push_back(sum/i);

    }

  }

  sort(ALL(divisor));

  ll ans=0;

  rep(i,0,divisor.size()){

    vector<ll> b;

    rep(j,0,n)b.push_back(a[j]%divisor[i]);

    sort(ALL(b),greater<ll>());

    int val=0,cnt=0;

    rep(j,0,n)val+=b[j];

    cnt=val,val/=divisor[i];

    rep(j,0,val)cnt-=b[j];

    if(cnt<=k)chmax(ans,divisor[i]);

  }

  printf("%lld\n",ans);

  return 0;

}

 

// Fastest known solution for this problem: