Challenge: Fun with 1010
Subdomeniu: Number Theory (number-theory)
Scor cont: 120.0 / 120
Submission status: Accepted
Submission score: 1.0
Submission ID: 464775662
Limbaj: python3
Link challenge: https://www.hackerrank.com/challenges/fun-with-1010/problem
Cerinta
When you look at photographs of watches and clocks, you'll find that they almost always show the time 10:10. There are lots of theories and even urban legends about this. For example, when showing 10:10, the hands look like a smile, and so you are more inclined to buy the watch or clock :D (a form of [subliminal advertising](http://en.wikipedia.org/wiki/Subliminal_stimuli#Consumption_and_television)).
Now, you are given $N$ and $M$. You are to find the number of sequences $A_1, A_2, \ldots, A_N$ such that:
- $A_1$ is a number of the form $1010^K$ for some $1 \le K \le M$,
- If $P = A_2 \cdot A_3 \cdots A_N$, then $A_1$ is divisible by $P$, and $P$ is divisible by $1010$, and
- $A_2, A_3, \ldots, A_N$ are squarefree.
Since the number can be very large, only give the number modulo $2000003$.
**Input Format**
The first line of input contains a single integer $T$, which is the number of test cases. The following lines contain the test cases.
Each test case consists of one line containing two integers, $N$ and $M$.
**Constraints**
$1 \le T \le 10^5$
$2 \le N \le M \le 10^{12}$
**Output Format**
For each test case, output a single line containing the answer.
**Sample Input**
2
2 3
3 3
**Sample Output**
3
62
**Explanation**
For the first test case, the possible sequences are:
$\{1010, 1010\}$,
$\{1020100, 1010\}$,
$\{1030301000, 1010\}$
Cod sursa
# Enter your code here. Read sys.stdin.readline from STDIN. Print output to STDOUT
import sys
mod = 2000003
factorial_cache = [1, 1]
inverted_factorial_cache = [1, 1]
cache_two = {}
cache_ss = {}
def f(n):
global factorial_cache
if n >= len(factorial_cache):
old_len = len(factorial_cache)
new_len = max(1 + n, len(factorial_cache) * 11 // 10)
factorial_cache += [0] * (new_len - old_len)
for i in range(old_len, new_len):
factorial_cache[i] = factorial_cache[i - 1] * i % mod
return factorial_cache[n]
def inv_f(n):
global inverted_factorial_cache
if n >= len(inverted_factorial_cache):
old_len = len(inverted_factorial_cache)
new_len = max(1 + n, len(inverted_factorial_cache) * 11 // 10)
inverted_factorial_cache += [-1] * (new_len-old_len)
if inverted_factorial_cache[n] < 0:
inverted_factorial_cache[n] = pow(f(n), mod - 2, mod)
return inverted_factorial_cache[n]
def Cnk(n, k):
if n < k:
return 0
return f(n) * inv_f(k) * inv_f(n - k) % mod
def CnkBigP(n, k):
zero = False
N = n
K = k
while N > 0:
NN = N % mod
KK = K % mod
if NN < KK:
zero = True
break
N //= mod
K //= mod
if zero:
return 0
result = 1
N = n
K = k
while N > 0:
NN = N % mod
KK = K % mod
result *= Cnk(NN, KK)
result %= mod
N //= mod
K //= mod
return result
def t(n):
global cache_two
if n not in cache_two:
cache_two[n] = pow(2, n, mod)
return cache_two[n]
def ss(n):
if n in cache_ss:
return cache_ss[n]
n2 = n + n
n3 = n2 + n
result = (n * t(n2 - 1) - (n2 - 1) * CnkBigP(n2 - 2, n - 1)) % mod
cache_ss[n] = (3 * (t(n - 1) - 1) * result - n * t(n3 - 2) + t(n - 1) * n3 - n, (t(n3) - 3 * t(n2) + 3 * t(n) - 1))
return cache_ss[n]
T = int(sys.stdin.readline())
for _ in range(T):
N, M = map(int, sys.stdin.readline().split())
n = N - 1
s, c = ss(n)
result = (s + c * (M + 1 - n)) % mod
print(result)
HackerRank Number Theory – Fun with 1010
