import strutils, sequtils, tables const factorTableSize = 100001 var factorTable: array[factorTableSize, seq[(int, int)]] for i in 2.. 0 and factorTable[j][^1][0] == i: factorTable[i * j].add((i, factorTable[j][^1][1] + 1)) else: factorTable[i * j].add((i, 1)) var n, k: int (n, k) = stdin.readLine.split.map(parseInt) const MOD = 1000000007 proc powMod(a, n: int): int = result = 1 var a = a n = n while n > 0: if n mod 2 == 1: result = (result * a) mod MOD a = (a * a) mod MOD n = n div 2 var factors = factorTable[n].toTable var count = 0 while count < k and not (factors.len == 1 and factors.keys.toSeq[0] <= 3 and (k - count) mod 2 == 0): var nextFactors = initTable[int, int]() for (p, power) in factors.pairs: for (q, power2) in factorTable[p + 1]: if not nextFactors.hasKey(q): nextFactors[q] = 0 nextFactors[q] = (nextFactors[q] + power * power2) mod (MOD - 1) count += 1 factors = nextFactors var remainK = k - count if remainK > 0: remainK = remainK div 2 var res = 1 x = 2 while remainK > 0: if remainK mod 2 == 1: res = (res * x) mod (MOD - 1) x = (x * x) mod (MOD - 1) remainK = remainK div 2 let key = factors.keys.toSeq[0] factors[key] = (factors[key] * res) mod (MOD - 1) var ans = 1 for (p, power) in factors.pairs: ans = (ans * powMod(p, power)) mod MOD echo ans