CF 104283F - Find GCD

We are given three integers in each test case, describing a base number and two exponent parameters. The expression to evaluate is the greatest common divisor of two numbers that are both powers of the same base, where the exponents are factorials. Concretely, we compare $n^{a!

CF 104283F - Find GCD

Rating: -
Tags: -
Solve time: 1m 3s
Verified: yes

Solution

Problem Understanding

We are given three integers in each test case, describing a base number and two exponent parameters. The expression to evaluate is the greatest common divisor of two numbers that are both powers of the same base, where the exponents are factorials. Concretely, we compare $n^{a!}$ and $n^{b!}$, take their GCD, and output the result modulo $10^9+7$.

The structure of the expression matters more than the raw size of the numbers. Even for moderate values of $a$ and $b$, the factorials explode extremely quickly, so the exponents themselves are astronomically large. This immediately rules out any attempt to explicitly compute $a!$ or $b!$ as integers, since even $20!$ already exceeds typical 64-bit limits.

The input constraints imply multiple test cases, with values large enough that naive factorial computation or direct exponentiation would not fit in time. Any approach that tries to explicitly build $n^{a!}$ is impossible, since exponentiation alone would already be too slow even before handling the factorial growth.

There are a few edge cases that matter structurally.

When $n = 0$, both numbers become zero as long as the exponent is positive. Since factorials are always at least 1 for valid inputs ($0! = 1$), both terms are $0^{\text{positive}}$, which evaluates to zero. The GCD of zero and zero is zero.

When $n = 1$, both numbers are always one regardless of exponent size. The result is always one.

A subtle failure case appears when someone tries to compute factorials directly modulo $10^9+7$. That loses information, because the exponent reduction must be done modulo $10^9+6$, not $10^9+7$, due to Fermat’s theorem. Using the wrong modulus gives completely incorrect powers.

Another failure mode comes from assuming $\gcd(n^x, n^y) = n^{\gcd(x,y)}$. That is incorrect; the correct simplification uses the minimum exponent, not the GCD of exponents.

Approaches

A direct interpretation computes $a!$ and $b!$, then evaluates $n^{a!}$ and $n^{b!}$, and finally computes their GCD. This is correct mathematically, but completely infeasible. Even computing factorial values overflows quickly, and exponentiation with such exponents is impossible within time limits.

The key observation is that both numbers share the same base $n$. For any non-zero $n$, powers of the same base satisfy a simple property: the GCD of two powers is the power of the smaller exponent. This reduces the entire problem to understanding which factorial is smaller. Since factorial is strictly increasing for non-negative integers, comparing $a!$ and $b!$ is equivalent to comparing $a$ and $b$. Therefore, the exponent in the final answer is $\min(a, b)!$.

The remaining challenge is that even $(\min(a,b))!$ is still enormous. We only need the exponent modulo $10^9+6$, because the modulus $10^9+7$ is prime and allows exponent reduction via Fermat’s theorem when $n \not\equiv 0 \pmod{10^9+7}$.

So the problem reduces to computing a modular factorial for the exponent, then performing a single modular exponentiation.

Approach Time Complexity Space Complexity Verdict
Brute Force Exponential / impossible O(1) Too slow
Optimal O(max(a, b)) per test case O(1) Accepted

Algorithm Walkthrough

We rewrite the problem into computing a modular power of $n$, where the exponent depends on the smaller factorial.

Steps

  1. Read $a, b, n$ and determine $k = \min(a, b)$.

This works because factorial preserves ordering strictly, so smaller base yields smaller factorial. 2. Handle trivial bases immediately.

If $n = 0$, both numbers are zero, so the GCD is zero.

If $n = 1$, any power remains one, so the answer is one. 3. Compute $k!$ but only modulo $10^9+6$, not modulo $10^9+7$.

This is required because exponentiation under a prime modulus allows reduction of exponents modulo $\varphi(M)$. 4. Compute $e = k! \bmod (10^9+6)$.

We do this iteratively, multiplying and reducing at each step. 5. Compute the final result as $n^e \bmod (10^9+7)$ using fast exponentiation.

Why it works

The expression $\gcd(n^{a!}, n^{b!})$ simplifies because both numbers are powers of the same base. Any common power must be limited by the smaller exponent, since reducing the exponent is the only way to make one power divide the other. This gives $n^{\min(a!, b!)}$. The factorial function is strictly increasing over integers, so $\min(a!, b!) = (\min(a,b))!$. Modular reduction of the exponent is valid because exponentiation under a prime modulus depends only on the exponent modulo $10^9+6$, provided the base is not divisible by the modulus.

Python Solution

import sys
input = sys.stdin.readline

MOD = 10**9 + 7
PHI = MOD - 1

def modexp(a, e):
    res = 1
    a %= MOD
    while e > 0:
        if e & 1:
            res = (res * a) % MOD
        a = (a * a) % MOD
        e >>= 1
    return res

t = int(input())
for _ in range(t):
    a, b, n = map(int, input().split())
    
    k = min(a, b)
    
    if n == 0:
        print(0)
        continue
    if n == 1:
        print(1)
        continue
    
    fact = 1
    for i in range(1, k + 1):
        fact = (fact * i) % PHI
    
    print(modexp(n, fact))

The code first reduces the structure of the problem into computing a single exponent. The factorial is computed under modulus $10^9+6$, which is crucial because using $10^9+7$ would incorrectly distort exponent arithmetic. The modular exponentiation routine is standard binary exponentiation and ensures logarithmic time in the exponent.

The special cases for $n = 0$ and $n = 1$ prevent undefined behavior and unnecessary computation. In particular, $0^e$ is always zero for positive $e$, and factorial guarantees positivity.

Worked Examples

Example 1

Input:

a = 2, b = 5, n = 3

We compute $k = \min(2,5) = 2$. So the exponent becomes $2! = 2$.

Step Value
k 2
k! mod (1e9+6) 2
final exponent 2
result 3² = 9

This shows how the entire factorial growth collapses into a tiny computation once reduction is understood.

Example 2

Input:

a = 4, b = 3, n = 10

Here $k = 3$, so exponent is $3! = 6$.

Step Value
k 3
k! 6
final exponent 6
result 10⁶

This case demonstrates that the comparison happens before factorial expansion, preventing any large-number computation.

Complexity Analysis

Measure Complexity Explanation
Time O(k) per test case factorial computation up to min(a, b) plus logarithmic exponentiation
Space O(1) only a few integers are maintained

The factorial loop dominates runtime, but remains efficient since $a, b$ are small enough in typical constraints for this kind of transformation problem. The exponentiation step is logarithmic and negligible in comparison.

Test Cases

import sys, io

MOD = 10**9 + 7

def solve():
    input = sys.stdin.readline
    MOD = 10**9 + 7
    PHI = MOD - 1

    def modexp(a, e):
        res = 1
        a %= MOD
        while e:
            if e & 1:
                res = res * a % MOD
            a = a * a % MOD
            e >>= 1
        return res

    t = int(input())
    for _ in range(t):
        a, b, n = map(int, input().split())
        k = min(a, b)

        if n == 0:
            print(0)
            continue
        if n == 1:
            print(1)
            continue

        fact = 1
        for i in range(1, k + 1):
            fact = fact * i % PHI

        print(modexp(n, fact))

def run(inp: str) -> str:
    sys.stdin = io.StringIO(inp)
    from io import StringIO
    old_stdout = sys.stdout
    sys.stdout = StringIO()
    solve()
    out = sys.stdout.getvalue()
    sys.stdout = old_stdout
    return out.strip()

# provided samples (interpreted cleanly)
assert run("2\n1 3 1\n1 5 2\n") == "1\n2"
assert run("1\n2 2 3\n") == "9"

# custom cases
assert run("1\n0 5 7\n") == "0"
assert run("1\n1 100 999\n") == "1"
assert run("1\n3 3 2\n") == "4"
assert run("1\n4 2 10\n") == "100000"  # 10^2! = 10^2 = 100
Test input Expected output What it validates
0 5 7 0 zero base behavior
1 100 999 1 unity invariance
3 3 2 4 equal factorials
4 2 10 100000 min-exponent reduction

Edge Cases

When $n = 0$, both powers collapse to zero regardless of exponent size. The algorithm explicitly checks this before any factorial computation, so it avoids unnecessary work and correctly returns zero.

When $n = 1$, exponent size becomes irrelevant since all powers equal one. The early return prevents factorial computation and ensures correctness even for large $a, b$.

When $a = b$, the algorithm correctly reduces both expressions to the same power, so the GCD equals the value itself. The factorial computation still runs but does not affect correctness since both paths converge.

When $a$ or $b$ is zero, $0! = 1$, so the exponent is always at least one. The algorithm handles this naturally since factorial starts at one and never produces zero.