[TASK]:
You will be given lines of pseudocode, your task is to write the corresponding C++ code. The pseudocode will provide detailed description of the c++ code line by line. The pseudocode is garanteed to be correct and complete.

[INSTRUCTION]:
The following libraries are already included in the code.
```cpp
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <fstream>
#include <climits>
#include <cassert>
#include <iomanip>
#include <sstream>
#include <bitset>
using namespace std;
```
Do not include them in your code again. Please surround your code with ```cpp and ``` markers. Note that the code should correspond to the pseudocode line by line.

[PSEUDOCODE]:
me is a map of long long to long long
create long long array fine with 100000 + 5 elements
pre is a void function
    for long long i = 2 to 100000 inclusive
        if fine[i] is equal to 0
            for j from 2 * i to 100000 inclusive increasing j by i, assign 1 to fine[j]
        end of the block
    end of the block
end of the block
create an arrays of long longs fact and invfact with 100000 elements each
pow is a long long function with long long arguments a, b and m
    declare long long variable ans = 1
    while b is not 1
        if b & 1 is not 0, assign (ans * a) % m to ans
        divide b by 2
        change a to (a * a) % m
    end of the block
    return ans
end of the block
long long function modinv with long long argument k
    return pow(k, 1000000007 - 2, 1000000007)
end of the block
define function precompute
    set fact[0] to set fact[1] to 1
    for i from 2 to 100000 exclusive
        assign fact[i - 1] * i to fact[i]
        fact[i] %= 1000000007
    end of the block
    set invfact[100000 - 1] to modinv(fact[100000 - 1])
    for i from 100000-2 to 0 inclusive decrementing i
        change invfact[i] to invfact[i + 1] * (i + 1)
        invfact[i] %= 1000000007
    end of the block
end of the block
function nCr with long long arguments x and y that returns long long
    if y is greater than x, return 0
    set long long num to fact[x]
    multiply num by invfact[y]
    num % =1000000007
    multiply num by invfact[x - y]
    num % =1000000007
    return num
end of the block
define the main function
    create long long n
    read n
    call precompute()
    call pre()
    loop i from 1 to n inclusive
        create long long temp
        read temp
        for j = 2 to 100000 inclusive
            create long long cur = 0
            if temp <= 1, stop the loop
            while temp modulo j = 0 && temp > 1
                increment cur
                divide temp by j
            end of the block
            if cur != 0, increase me[j] by cur
        end of the block
        if temp != 1, increase me[temp] by 1
    end of the block
    create map iterator it
    declare long long ans = 1
    move it through me in a loop
        declare long long variable temp = it->second
        multiply ans by nCr(temp + n - 1, temp)
        ans % =1000000007
    end of the block
    print ans
    return to indicate successful execution
end of the block

[CODE]:

map<long long, long long> me;
long long fine[100000 + 5];
void pre() {
    for (long long i = 2; i <= 100000; i++) {
        if (fine[i] == 0) {
            for (long long j = 2 * i; j <= 100000; j += i) { fine[j] = 1; }
        }
    }
}
long long fact[100000], invfact[100000];
long long pow(long long a, long long b, long long m) {
    long long ans = 1;
    while (b) {
        if (b & 1) ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}
long long modinv(long long k) {
    return pow(k, 1000000007 - 2, 1000000007);
}
void precompute() {
    fact[0] = fact[1] = 1;
    for (long long i = 2; i < 100000; i++) {
        fact[i] = fact[i - 1] * i;
        fact[i] %= 1000000007;
    }
    invfact[100000 - 1] = modinv(fact[100000 - 1]);
    for (long long i = 100000 - 2; i >= 0; i--) {
        invfact[i] = invfact[i + 1] * (i + 1);
        invfact[i] %= 1000000007;
    }
}
long long nCr(long long x, long long y) {
    if (y > x) return 0;
    long long num = fact[x];
    num *= invfact[y];
    num %= 1000000007;
    num *= invfact[x - y];
    num %= 1000000007;
    return num;
}
int main() {
    long long n;
    cin >> n;
    precompute();
    pre();
    for (long long i = 1; i <= n; i++) {
        long long temp;
        cin >> temp;
        for (long long j = 2; j <= 100000; j++) {
            long long cur = 0;
            if (temp <= 1) break;
            while (temp % j == 0 && temp > 1) {
                cur++;
                temp /= j;
            }
            if (cur != 0) me[j] += cur;
        }
        if (temp != 1) me[temp] += 1;
    }
    map<long long, long long>::iterator it;
    long long ans = 1;
    for (it = me.begin(); it != me.end(); it++) {
        long long temp = it->second;
        ans *= nCr(temp + n - 1, temp);
        ans %= 1000000007;
    }
    cout << ans << endl;
    return 0;
}