import sys

readline = sys.stdin.readline
MOD = 10 ** 9 + 7
INF = float('INF')
sys.setrecursionlimit(10 ** 5)


def main():
    import bisect

    n, k = map(int, readline().split())
    a = list(map(int, readline().split()))
    a.sort()

    neg = bisect.bisect_left(a, 0)
    zer = bisect.bisect_right(a, 0) - neg
    pos = n - (neg + zer)

    a_neg = a[:neg]
    a_pos = a[-pos:] if pos > 0 else []
    a_pos.sort(reverse=True)

    ans = 0
    flag = False

    if k % 2 == 0:
        a2 = []
        for i in range(0, pos - 1, 2):
            a2.append(a_pos[i] * a_pos[i + 1])
        for i in range(0, neg - 1, 2):
            a2.append(a_neg[i] * a_neg[i + 1])
        a2.sort(reverse=True)
        if len(a2) * 2 >= k:
            flag = True
            ans = 1
            for i in range(k // 2):
                ans *= a2[i]
                ans %= MOD
    else:
        a2 = []
        for i in range(1, pos - 1, 2):
            a2.append(a_pos[i] * a_pos[i + 1])
        for i in range(0, neg - 1, 2):
            a2.append(a_neg[i] * a_neg[i + 1])
        a2.sort(reverse=True)
        if pos > 0 and len(a2) * 2 + 1 >= k:
            flag = True
            ans = a_pos[0]
            for i in range(k // 2):
                ans *= a2[i]
                ans %= MOD

    if not flag:
        if zer > 0:
            ans = 0
        elif k % 2 == 0:
            b2 = []
            a_pos.sort()
            a_neg.sort(reverse=True)

            for i in range(1, neg - 1, 2):
                b2.append(a_neg[i] * a_neg[i + 1])
            for i in range(1, pos - 1, 2):
                b2.append(a_pos[i] * a_pos[i + 1])
            b2.sort()
            if len(b2) * 2 + 2 >= k:
                ans = a_pos[0] * a_neg[0]
                for i in range(k // 2):
                    ans *= b2[i]
                    ans %= MOD
        else:
            b2 = []
            a_pos.sort()
            a_neg.sort(reverse=True)
            for i in range(1, neg - 1, 2):
                b2.append(a_neg[i] * a_neg[i + 1])
            for i in range(0, pos - 1, 2):
                b2.append(a_pos[i] * a_pos[i + 1])
            b2.sort()
            if neg > 0 and len(b2) * 2 + 1 >= k:
                ans = a_neg[0]
                for i in range(k // 2):
                    ans *= b2[i]
                    ans %= MOD

    print(ans)

if __name__ == '__main__':
    main()


### FIXED CODE ###

import sys

readline = sys.stdin.readline
MOD = 10 ** 9 + 7
INF = float('INF')
sys.setrecursionlimit(10 ** 5)


def main():
    import bisect

    n, k = map(int, readline().split())
    a = list(map(int, readline().split()))
    a.sort()

    neg = bisect.bisect_left(a, 0)
    zer = bisect.bisect_right(a, 0) - neg
    pos = n - (neg + zer)

    a_neg = a[:neg]
    a_pos = a[-pos:] if pos > 0 else []
    a_pos.sort(reverse=True)

    ans = 0
    flag = False
    
    if k == n:
        ans = 1
        for x in a:
            ans *= x
            ans %= MOD
        print(ans)
        sys.exit()

    if k % 2 == 0:
        a2 = []
        for i in range(0, pos - 1, 2):
            a2.append(a_pos[i] * a_pos[i + 1])
        for i in range(0, neg - 1, 2):
            a2.append(a_neg[i] * a_neg[i + 1])
        a2.sort(reverse=True)
        if len(a2) * 2 >= k:
            flag = True
            ans = 1
            for i in range(k // 2):
                ans *= a2[i]
                ans %= MOD
    else:
        a2 = []
        for i in range(1, pos - 1, 2):
            a2.append(a_pos[i] * a_pos[i + 1])
        for i in range(0, neg - 1, 2):
            a2.append(a_neg[i] * a_neg[i + 1])
        a2.sort(reverse=True)
        if pos > 0 and len(a2) * 2 + 1 >= k:
            flag = True
            ans = a_pos[0]
            for i in range(k // 2):
                ans *= a2[i]
                ans %= MOD

    if not flag:
        if zer > 0:
            ans = 0
        elif k % 2 == 0:
            b2 = []
            a_pos.sort()
            a_neg.sort(reverse=True)

            for i in range(1, neg - 1, 2):
                b2.append(a_neg[i] * a_neg[i + 1])
            for i in range(1, pos - 1, 2):
                b2.append(a_pos[i] * a_pos[i + 1])
            b2.sort()
            if len(b2) * 2 + 2 >= k:
                ans = a_pos[0] * a_neg[0]
                for i in range(k // 2):
                    ans *= b2[i]
                    ans %= MOD
        else:
            b2 = []
            a_pos.sort()
            a_neg.sort(reverse=True)
            for i in range(1, neg - 1, 2):
                b2.append(a_neg[i] * a_neg[i + 1])
            for i in range(0, pos - 1, 2):
                b2.append(a_pos[i] * a_pos[i + 1])
            b2.sort()
            if neg > 0 and len(b2) * 2 + 1 >= k:
                ans = a_neg[0]
                for i in range(k // 2):
                    ans *= b2[i]
                    ans %= MOD

    print(ans)

if __name__ == '__main__':
    main()