Challenge: Divisor Exploration
Subdomeniu: Number Theory (number-theory)
Scor cont: 50.0 / 50
Submission status: Accepted
Submission score: 1.0
Submission ID: 464753647
Limbaj: python3
Link challenge: https://www.hackerrank.com/challenges/divisor-exploration/problem
Cerinta
You are given $D$ datasets where each dataset is in the form of two integers, $m$ and $a$, such that:
$$n = \prod\limits_{i = 1}^{m} p_i^{a+i} \text{, where } p_i \text{ is the } i^{th} \text{ prime.}$$
For each dataset, find and print the following on a new line:
$$\sum\limits_{d|n} \sigma_{0}(d)$$
where $\sigma_{0}(x)$ is the count of divisors of $x$. As the answer can be quite large, print the result of this value modulo $(10^9 + 7)$.
Input Format
The first line contains an integer, $D$, denoting the number of datasets.
Each line $i$ of the $D$ subsequent lines contains two space-separated integers describing the respective values of $m_i$ and $a_i$ for dataset $i$.
Output Format
For each dataset, print a single integer denoting the result of the summation above modulo $(10^9 + 7)$ on a new line.
Constraints
+ $1 \le D \le 10^5$
+ $1 \le m \le 10^5$
+ $0 \le a \le 10^5$
Cod sursa
#!/bin/python3
import sys
MOD = 10 ** 9 + 7
INV2 = (MOD + 1) // 2
def main():
data = sys.stdin.buffer.read().split()
if not data:
return
d = int(data[0])
queries = []
ptr = 1
max_n = 0
for _ in range(d):
m = int(data[ptr])
a = int(data[ptr + 1])
ptr += 2
queries.append((m, a))
if a + m + 2 > max_n:
max_n = a + m + 2
fact = [1] * (max_n + 1)
for i in range(1, max_n + 1):
fact[i] = fact[i - 1] * i % MOD
inv_fact = [1] * (max_n + 1)
inv_fact[max_n] = pow(fact[max_n], MOD - 2, MOD)
for i in range(max_n, 0, -1):
inv_fact[i - 1] = inv_fact[i] * i % MOD
inv2_pow = [1] * (100000 + 5)
for i in range(1, len(inv2_pow)):
inv2_pow[i] = inv2_pow[i - 1] * INV2 % MOD
out = []
for m, a in queries:
# Product over i=1..m of ((a+i+1)(a+i+2)/2)
# = [ (a+2..a+m+1) * (a+3..a+m+2) ] * 2^{-m}
p1 = fact[a + m + 1] * inv_fact[a + 1] % MOD
p2 = fact[a + m + 2] * inv_fact[a + 2] % MOD
ans = p1 * p2 % MOD
ans = ans * inv2_pow[m] % MOD
out.append(str(ans))
sys.stdout.write('\n'.join(out))
if __name__ == '__main__':
main()
HackerRank Number Theory – Divisor Exploration
