Solution Approach
 Initially, calculate get_primes and get_factorials once.
 After taking input from the user we check for all the get_primes number such that the multiplication comes out to be x with y number of elements.
 After getting one such set we permute it with total number of ways to represent yfactorizations i.e. add negative sign if possible.
 We keep count for each permutation possible and finally return the count.
C++ implementation
/* C++ implementation of E. counting arrays */
#include <iostream>
#include <vector>
using namespace std;
/* Calculating get_primes and get_factorials once in starting in main code */
vector<int> get_primes(int n) {
vector<char> prime;
for (int i = 0; i != n + 1; i += 1) {
prime.push_back(true);
}
prime[1] = false;
prime[0] = false;
for (int i = 2; i <= n; i += 1) {
if (prime[i]) {
if (i * i <= n) {
for (int j = i*i; j <= n; j += i) {
prime[j] = false;
}
}
}
}
vector<int> ans;
for (int i = 0; i != prime.size(); i += 1) {
if (prime[i]) {
ans.push_back(i);
}
}
return ans;
}
/* Calculating get_primes and get_factorials once in starting in main code */
vector<int> get_factorials(int n, int mod) {
vector<int> res = {1};
res.reserve(2e6);
for (int i = 1; i != n + 1; ++i) {
res.push_back((res[i  1] * i) % mod);
}
return res;
}
/* All possible permutation of integers */
int binpow(int a, int n, int mod) {
if (n == 0) {
return 1;
}
if (n % 2 == 1) {
return (binpow(a, n  1, mod) * a) % mod;
}
return binpow((a * a) % mod, n / 2, mod);
}
int bin_coef(int n, int k, vector<int>& factorials, vector<int>& op_factorials, int mod) {
return (
(
(
factorials[n] * op_factorials[k]
) % mod
) * op_factorials[n  k]
) % mod;
}
vector<int> factorization(int n, vector<int>& primes) {
vector<int> res;
res.reserve(20);
for (int i = 0; primes[i] * primes[i] <= n; i += 1) {
if (n % primes[i] != 0) {
continue;
}
int exp = 0;
while (n % primes[i] == 0) {
exp += 1;
n /= primes[i];
}
res.push_back(exp);
}
if (n > 1){
res.push_back(1);
}
return res;
}
/* Main function to counting arrays */
int solve(int x, int y, vector<int>& primes, vector<int>& factorials, vector<int>& op_factorials, int mod) {
auto exps = factorization(x, primes);
int ans = 1;
for (int i = 0; i != exps.size(); i += 1) {
ans *= bin_coef(
y + exps[i]  1,
exps[i],
factorials,
op_factorials,
mod
);
ans %= mod;
}
ans = (ans * binpow(2, y  1, mod)) % mod;
return ans;
}
/* Main Code */
signed main() {
/* Given modulo condition to print in the question */
const int mod = 1e9 + 7;
auto primes = get_primes(2000);
auto factorials = get_factorials(2000000, mod);
vector<int> op_factorials;
op_factorials.reserve(factorials.size());
for (auto val : factorials) {
op_factorials.push_back(binpow(val, mod  2, mod));
}
int q;
/* Taking number of test cases as input from user */
cin >> q;
/* Running while loop to run q test cases as given in E. counting arrays problem */
while (q) {
int x, y;
/* Taking x and y input as given in E. counting arrays problem */
cin >> x >> y;
/* Main function to counting arrays */
int res = solve(x, y, primes, factorials, op_factorials, mod);
cout << res << "\n";
}
}
Input
2
6 3
4 2
Output
36
6
Complexities
Time complexity
O(x^{2}y)
Reason: Two nested loops are required of size x. One loop of y is called in the function binpow function, so the time complexity is O(x^{2}y)
Space complexity
O(n), where n is the given modulo in the problem statement.
Reason: We have used the push_back operation while running the binpow function so that the space complexity will be O(n).
Frequently Asked Questions

In C++, what is an array?
An array is a sort of data structure in C++ that allows you to store multiple values of the same type.

How are arrays classified?
Because they hold elements of the same type, arrays are categorized as homogenous data structures. In a single array, we can't have primitive data types together. On the other hand, arrays can contain unique numbers, strings, boolean values (true and false), characters, objects, and so on.

What is the purpose of an array?
Arrays are best for storing several values in a single variable and processing a large number of values quickly. Using the indices, we can quickly retrieve the array elements. In any programming language, arrays are the most commonly used data type.

In C, what is array decay?
Array decay is the loss of an array's type and dimensions. It happens when we use a pointer or a value to send an array into a function. The array receives the initial address, which is a pointer. As a result, the array's size differs from the original.

In C++, how do you pass an array by reference?
A whole array cannot be passed as an argument to a function in C++. You can, however, supply a pointer to an array without an index by specifying the array's name.
Key Takeaways
In this article, we have solved the E. counting arrays problem using C++ language. We hope that this question will help you understand the concept of how to create an array with a given number of elements and the product of all elements.
Recommended problems 
Attempt our Online Mock Test Series on Coding Ninjas Studio now!
Happy Coding!