Challenge: Order of Prime in Factorial

Subdomeniu: Number Theory (number-theory)

Scor cont: 100.0 / 100

Submission status: Accepted

Submission score: 1.0

Submission ID: 464775450

Limbaj: python3

Link challenge: https://www.hackerrank.com/challenges/order-of-prime-in-factorial/problem

Cerinta

For a given prime $p$, define $\operatorname{ord}_p(k)$ as the multiplicity of $p$ in $k$, i.e. the number of times $p$ appears in the prime factorization of $k$.

For a given $p$ (prime) and $L$, let $F(p,L)$ be the number of integers $n$ such that $1 \le n \le L$ and $\operatorname{ord}_p(n!)$ is divisible by $p$. Here $n!$ denotes the factorial of $n$.

Your job is to calculate $F(p,L)$ given $p$ and $L$.

**Input Format**  
The first line contains the number of test cases $T$.   
Each of the next $T$ lines contains two integers $p$ and $L$ separated by a space.

**Output Format**  
For each test case, output one line containing $F(p,L)$.


**Constraints**  
$1 \le T \le 100000$  
$2 \le p \le 10^{18}$  
$1 \le L \le 10^{18}$  
$p$ is prime

**Sample input**  

    2
    2 6
    3 6
    

**Sample Output**  

    2
    2

**Explanation**   
Here are the first 6 factorials: 1, 2, 6, 24, 120, 720.  

The multiplicities of 2 in these numbers are: 0, 1, 1, 3, 3, 4.  
Exactly two of these are divisible by 2 (0 and 4), so $F(2,6) = 2$.

The multiplicities of 3 in these numbers are: 0, 0, 1, 1, 1, 2.  
Exactly two of these are divisible by 3 (0 and 0), so $F(3,6) = 2$.

Cod sursa

def ok(p, L):
    sum = 0
    while L > 0:
        sum += L % p
        L //= p
    return sum % p

def solve(p, L):
    L1 = L // p
    r = p - ok(p, L1)
    if r == p:
        r = 0
    if r < L % p:
        return L1 + 1
    else:
        return L1

T = int(input())
for t in range(T):
    p, L = map(int, input().split())
    L += 1
    L1 = L // p
    ans = 0
    if ok(p, L1) == 0:
        ans += L % p
    print(ans + solve(p, L1) * p - 1)
HackerRank Number Theory – Order of Prime in Factorial