Hướng dẫn giải của Cho kẹo hay bị ghẹo

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Nhận xét: Ước chung lớn nhất của ~A!~ và ~B!~ là ~\min(A, B)!~.

Subtask ~1, 2~ ~(1 \le A, B \le 10^6)~:
  • Ta có thể tính giai thừa bằng hàm đệ quy hoặc vòng lặp.
  • Áp dụng phép nhân Ấn Độ ta có: ~(A \times B) \bmod P = (A \bmod P) \times (B \bmod P)~.
Subtask ~3~ ~(1 \le A, B \le 10^{12})~:
  • Ta sẽ xét thêm trường hợp ~\min(A, B) \ge P~.
  • Theo đề bài ta có: ~1 \le P \le 10^6~. Xét số ~M \ge 10^6~ bất kì ta có:

$$ M! = 1\times2\times3\times\dots\times(M-1)\times M $$

Khi đó ~P \le M~ nên ~M!~ có chứa thừa số bằng ~P \implies~ ~M! \bmod P = 0~.

Code tham khảo
long long a, b, p;

long long factorial(long long n) {
    return !n ? 1 : n * factorial(n - 1) % p;
}

void solve() {
    cin >> a >> b >> p;

    if (min(a, b) >= p) cout << 0, exit(0);

    cout << factorial(min(a, b));
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.