#![allow(unused_imports)]
#![allow(non_snake_case)]
use std::cmp::*;
use std::collections::*;
use std::io::Write;

#[allow(unused_macros)]
macro_rules! debug {
    ($($e:expr),*) => {
        #[cfg(debug_assertions)]
        $({
            let (e, mut err) = (stringify!($e), std::io::stderr());
            writeln!(err, "{} = {:?}", e, $e).unwrap()
        })*
    };
}

fn main() {
    let v = read_vec::<usize>();
    let (n, k) = (v[0], v[1]);
    let a = read_vec::<usize>();
    let sum = a.iter().sum::<usize>();
    let primes = get_primes(20000);
    let fact_dict = factorize(sum, &primes);
    let mut factors = collect_all_factors(&fact_dict);
    factors.sort();
    debug!(factors);

    let mut ans = 1;
    'outer: for fact in factors {
        let mut residuals = a.iter()
            .map(|&x| if x % fact == 0 { 0 } else { fact - (x % fact) })
            .collect::<Vec<_>>();
        let mut res_sum = residuals.iter().sum::<usize>();
        let mut residuals = a.iter().map(|&x| x % fact).collect::<Vec<_>>();
        residuals.sort();
        debug!(fact, res_sum, residuals);

        let mut handle_num = 0;
        for i in 0..n {
            if residuals[i] == 0 {
                continue;
            }
            handle_num += residuals[i];
            if res_sum < fact {
                continue 'outer;
            }
            res_sum -= fact;
            if handle_num > k {
                continue 'outer;
            }
            if res_sum == 0 {
                ans = fact;
                break;
            }
        }
    }
    println!("{}", ans);
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

fn get_primes(n: usize) -> Vec<usize> {
    let mut is_prime = vec![true; n + 1];
    let mut primes = Vec::new();
    is_prime[0] = false;
    is_prime[1] = false;

    for i in 2..n + 1 {
        if is_prime[i] {
            primes.push(i);
            let mut j = 2 * i;
            while j < n {
                is_prime[j] = false;
                j += i;
            }
        }
    }
    primes
}

fn factorize(mut num: usize, primes: &Vec<usize>) -> std::collections::HashMap<usize, usize> {
    // max_primes >= (num)^(1/2)
    let mut dict = std::collections::HashMap::new();
    for &p in primes.iter() {
        while num % p == 0 {
            *dict.entry(p).or_insert(0) += 1usize;
            num /= p;
        }
        if num == 1 {
            break;
        }
    }
    if num != 1 {
        dict.insert(num, 1);
    }
    dict
}

fn pow(n: usize, mut p: usize) -> usize {
    let mut r = n;
    let mut ret = 1;
    while p > 0 {
        if p % 2 == 0 {
            r = r * r;
            p /= 2;
        } else {
            ret = ret * r;
            p -= 1;
        }
    }
    ret
}

fn collect_all_factors(dict: &std::collections::HashMap<usize, usize>) -> Vec<usize> {
    let mut ret = vec![1];
    for &key in dict.keys() {
        let mut new = ret.clone();

        for coef in 1..dict[&key] + 1 {
            let coef_1 = pow(key, coef);
            for &num in ret.iter() {
                new.push(num * coef_1);
            }
        }
        ret = new;
    }
    ret
}


Measured memory_bytes: 4476