"""

まず、答えは必ずAの総和以下になる。なぜなら、A同士の差の最大値がAの総和だからである。

移動回数が足りるのであれば、一つだけAの総和になるような項を作って、他を全部0にするのがよい。

ここからわかるのは、数を移動させ終わった後の各Aは全て0以上になるということである。



また答えはからなずAの総和の約数になる。

理由：

答えをXとすると、各AはbXと表すことができる。

したがって、Aの総和＝(bの総和*X)となる。

ゆえに、答えXはAの総和の約数である。



解法としては、Aの総和の約数を列挙して、大きい順に実現可能かどうかを試していく。

実現可能かどうかを試すには、各Aを総和の約数dで割ったときの余りをもとめて、小さい順にソートする。

そのうえで、左からL番目までを「数を与える側」、L+1番目以降を「数をもらう側」として余りが0になるように調整できないかを確かめる。

これは累積和を活用することですくない計算量で実行可能である。

最後に、移動した数がK以下かどうかを確認する。

"""

from itertools import accumulate

N,K = list(map(int,input().split()))

A = list(map(int,input().split()))

sumA = sum(A)

 

yakusu = []

d = 1

while d*d < sumA:

    if sumA%d == 0:

        yakusu.append(d)

        yakusu.append(sumA//d)

    d += 1

if d*d == sumA:

    yakusu.append(d)

yakusu.sort(reverse=True)

for d in yakusu:

    #約数の大きい順に、実現可能かどうかを試していく。

    rest = [a%d for a in A]

    rest.sort()

    

    rest = [a%d for a in A]

    rest.sort()

    Rrest = [d-r for r in rest]

    Rrest = Rrest[::-1]

    rest = [0]+list(accumulate(rest))

    Rrest = [0]+list(accumulate(Rrest))

    for i in range(N+1):

        if rest[i] == Rrest[N-i]:

            if rest[i] <= K:

                print(d)

                exit()

            break
"""

どんなに操作をおこなっても、全てのi,j(i<j)に関して、Ai,Ajの絶対値の差がsum(A)より大きくなることはない。

したがって、答えがsum(A)より大きくなることはない。

さらに言うなら、数値の状態がワイルドカードである0がベストなので負の値にする必要もない。



また、答えはsum(A)の約数になる。

答えをXとおくと、全ての数はXで割り切れる＝Xの倍数である。

Ai/X = Biとおくと、XBi = Ai　と表すことができる。。

X*sum(B) = sum(A)なので、答えXはsum(A)の約数であることがわかる。



解法：

基本方針としては、sum(A)の約数を列挙して、K回以内の操作で大きい順に実現可能かどうかを調べる。

実現可能かどうかは、各Aiを数が引かれる方と足される方に分けることで考えることができる。

"""

from itertools import accumulate

N,K = list(map(int,input().split()))

A = list(map(int,input().split()))



sumA = sum(A)



#sumAの約数を列挙する。

yakusu = []

d = 1

while d*d < sumA:

    if sumA%d == 0:

        yakusu.append(d)

        yakusu.append(sumA//d)

    d += 1

if d*d == sumA:

    yakusu.append(d)

yakusu.sort(reverse=True)



for d in yakusu:

    X = [A[i]%d for i in range(N)]

    X.sort()

    Y = [d-x for x in X]

    Y.sort()

    X = list(accumulate(X))

    Y = list(accumulate(Y))

    Y = Y[::-1]

    for i in range(N-1):

        if X[i] == Y[i+1] and X[i]<=K:

            print(d)

            exit()

    if X[N-1] == 0:

        print(d)

        exit()
"""
まず、答えは必ずAの総和以下になる。なぜなら、A同士の差の最大値がAの総和だからである。
移動回数が足りるのであれば、一つだけAの総和になるような項を作って、他を全部0にするのがよい。
ここからわかるのは、数を移動させ終わった後の各Aは全て0以上になるということである。
また答えはからなずAの総和の約数になる。
理由：
答えをXとすると、各AはbXと表すことができる。
したがって、Aの総和＝(bの総和*X)となる。
ゆえに、答えXはAの総和の約数である。
解法としては、Aの総和の約数を列挙して、大きい順に実現可能かどうかを試していく。
実現可能かどうかを試すには、各Aを総和の約数dで割ったときの余りをもとめて、小さい順にソートする。
そのうえで、左からL番目までを「数を与える側」、L+1番目以降を「数をもらう側」として余りが0になるように調整できないかを確かめる。
これは累積和を活用することですくない計算量で実行可能である。
最後に、移動した数がK以下かどうかを確認する。
"""
from itertools import accumulate

N, K = list(map(int, input().split()))
A = list(map(int, input().split()))
sumA = sum(A)
yakusu = []
d = 1
while d * d < sumA:
    if sumA % d == 0:
        yakusu.append(d)
        yakusu.append(sumA // d)
    d += 1
if d * d == sumA:
    yakusu.append(d)
yakusu.sort(reverse=True)
for d in yakusu:
    # 約数の大きい順に、実現可能かどうかを試していく。
    rest = [a % d for a in A]
    rest.sort()
    rest = [a % d for a in A]
    rest.sort()
    Rrest = [d - r for r in rest]
    Rrest = Rrest[::-1]
    rest = [0] + list(accumulate(rest))
    Rrest = [0] + list(accumulate(Rrest))
    for i in range(N + 1):
        if rest[i] == Rrest[N - i]:
            if rest[i] <= K:
                print(d)
                exit()
            break

"""
どんなに操作をおこなっても、全てのi,j(i<j)に関して、Ai,Ajの絶対値の差がsum(A)より大きくなることはない。
したがって、答えがsum(A)より大きくなることはない。
さらに言うなら、数値の状態がワイルドカードである0がベストなので負の値にする必要もない。
また、答えはsum(A)の約数になる。
答えをXとおくと、全ての数はXで割り切れる＝Xの倍数である。
Ai/X = Biとおくと、XBi = Ai　と表すことができる。。
X*sum(B) = sum(A)なので、答えXはsum(A)の約数であることがわかる。
解法：
基本方針としては、sum(A)の約数を列挙して、K回以内の操作で大きい順に実現可能かどうかを調べる。
実現可能かどうかは、各Aiを数が引かれる方と足される方に分けることで考えることができる。
"""
from itertools import accumulate

N, K = list(map(int, input().split()))
A = list(map(int, input().split()))
sumA = sum(A)
# sumAの約数を列挙する。
yakusu = []
d = 1
while d * d < sumA:
    if sumA % d == 0:
        yakusu.append(d)
        yakusu.append(sumA // d)
    d += 1
if d * d == sumA:
    yakusu.append(d)
yakusu.sort(reverse=True)
for d in yakusu:
    X = [A[i] % d for i in range(N)]
    X.sort()
    Y = [d - x for x in X]
    Y.sort()
    X = list(accumulate(X))
    Y = list(accumulate(Y))
    Y = Y[::-1]
    for i in range(N - 1):
        if X[i] == Y[i + 1] and X[i] <= K:
            print(d)
            exit()
    if X[N - 1] == 0:
        print(d)
        exit()

-まず、答えは必ずAの総和以下になる。なぜなら、A同士の差の最大値がAの総和だからである。 -移動回数が足りるのであれば、一つだけAの総和になるような項を作って、他を全部0にするのがよい。 -ここからわかるのは、数を移動させ終わった後の各Aは全て0以上になるということである。 -また答えはからなずAの総和の約数になる。 -理由： -答えをXとすると、各AはbXと表すことができる。 -したがって、Aの総和＝(bの総和*X)となる。 -ゆえに、答えXはAの総和の約数である。 -解法としては、Aの総和の約数を列挙して、大きい順に実現可能かどうかを試していく。 -実現可能かどうかを試すには、各Aを総和の約数dで割ったときの余りをもとめて、小さい順にソートする。 -そのうえで、左からL番目までを「数を与える側」、L+1番目以降を「数をもらう側」として余りが0になるように調整できないかを確かめる。 -これは累積和を活用することですくない計算量で実行可能である。 -最後に、移動した数がK以下かどうかを確認する。 +どんなに操作をおこなっても、全てのi,j(i<j)に関して、Ai,Ajの絶対値の差がsum(A)より大きくなることはない。 +したがって、答えがsum(A)より大きくなることはない。 +さらに言うなら、数値の状態がワイルドカードである0がベストなので負の値にする必要もない。 +また、答えはsum(A)の約数になる。 +答えをXとおくと、全ての数はXで割り切れる＝Xの倍数である。 +Ai/X = Biとおくと、XBi = Ai　と表すことができる。。 +X*sum(B) = sum(A)なので、答えXはsum(A)の約数であることがわかる。 +解法： +基本方針としては、sum(A)の約数を列挙して、K回以内の操作で大きい順に実現可能かどうかを調べる。 +実現可能かどうかは、各Aiを数が引かれる方と足される方に分けることで考えることができる。 +# sumAの約数を列挙する。 -    # 約数の大きい順に、実現可能かどうかを試していく。 -    rest = [a % d for a in A] -    rest.sort() -    rest = [a % d for a in A] -    rest.sort() -    Rrest = [d - r for r in rest] -    Rrest = Rrest[::-1] -    rest = [0] + list(accumulate(rest)) -    Rrest = [0] + list(accumulate(Rrest)) -    for i in range(N + 1): -        if rest[i] == Rrest[N - i]: -            if rest[i] <= K: -                print(d) -                exit() -            break +    X = [A[i] % d for i in range(N)] +    X.sort() +    Y = [d - x for x in X] +    Y.sort() +    X = list(accumulate(X)) +    Y = list(accumulate(Y)) +    Y = Y[::-1] +    for i in range(N - 1): +        if X[i] == Y[i + 1] and X[i] <= K: +            print(d) +            exit() +    if X[N - 1] == 0: +        print(d) +        exit()