import
java.util.*;
public
class
Main {
static
final
long
MOD = (
long
)1e9 +
7
;
static
final
long
sz = (
long
)3e5;
static
long
modularMultiplication(
long
a,
long
b)
{
return
((a % MOD) * (b % MOD)) % MOD;
}
static
void
precomputeInverse(ArrayList<Long> inv)
{
long
p = MOD;
inv.set(
1
, 1L);
for
(
long
i =
2
; i < sz; ++i) {
inv.set((
int
)i, modularMultiplication(
p - (p / i),
inv.get((
int
)(p % i))));
}
}
static
void
precomputeFactorial(ArrayList<Long> factorial,
ArrayList<Long> inv_factorial,
ArrayList<Long> inv)
{
factorial.set(
0
, 1L);
inv_factorial.set(
0
, 1L);
for
(
long
i =
1
; i < sz; i++) {
factorial.set(
(
int
)i,
modularMultiplication(
factorial.get((
int
)(i -
1
)), i));
inv_factorial.set(
(
int
)i, modularMultiplication(
inv_factorial.get((
int
)(i -
1
)),
inv.get((
int
)i)));
}
}
static
long
binomialCoefficient(
long
n,
long
k,
ArrayList<Long> factorial,
ArrayList<Long> inv_factorial)
{
long
res = modularMultiplication(
factorial.get((
int
)n),
inv_factorial.get((
int
)k));
res = modularMultiplication(
res, inv_factorial.get((
int
)(n - k)));
return
res;
}
static
long
primeFactorization(
long
N,
long
M,
ArrayList<Long> factorial,
ArrayList<Long> inv_factorial)
{
long
ans =
1
;
for
(
long
p =
2
; p * p <= N; p++) {
if
(N % p ==
0
) {
long
e =
0
;
while
(N % p ==
0
) {
N = N / p;
e++;
}
ans = modularMultiplication(
ans, binomialCoefficient(
e + M -
1
, e, factorial,
inv_factorial));
}
}
if
(N >
1
) {
long
e =
1
;
ans = modularMultiplication(
ans,
binomialCoefficient(e + M -
1
, e, factorial,
inv_factorial));
}
return
ans;
}
static
long
calculate(
long
N,
long
M,
ArrayList<Long> factorial,
ArrayList<Long> inv_factorial)
{
long
ans =
1
;
for
(
long
i =
0
; i < M -
1
; i++) {
ans = modularMultiplication(ans,
2
);
}
ans = modularMultiplication(
ans, primeFactorization(N, M, factorial,
inv_factorial));
return
ans;
}
static
long
solve(
long
N,
long
M)
{
if
(N <
0
) {
N = -N;
}
ArrayList<Long> factorial =
new
ArrayList<>();
ArrayList<Long> inv =
new
ArrayList<>();
ArrayList<Long> inv_factorial =
new
ArrayList<>();
for
(
int
i =
0
; i < sz; i++) {
factorial.add(0L);
inv.add(0L);
inv_factorial.add(0L);
}
precomputeInverse(inv);
precomputeFactorial(factorial, inv_factorial, inv);
long
ans
= calculate(N, M, factorial, inv_factorial);
return
ans;
}
public
static
void
main(String[] args)
{
long
N, M;
N =
4
;
M =
2
;
System.out.println(
"Number of ways to represent N using M integers is: "
+ solve(N, M) +
"."
);
}
}