Editorial for Giai thừa


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: Yunan

Subtask 1: Dễ dàng nhận thấy rằng N \le K, nên ta có thể kiểm tra các giá trị N! và tìm đáp án.

Độ phức tạp: O(K)

Subtask 2: Để N! chia hết cho 2^i và giá trị N là nhỏ nhất, N! phải là bội số của (2.1)\times(2.2)\times(2.3)\times...\times(2.j).

Ban đầu gán j=0. Ta tiến hành vòng lặp như sau với điều kiện i>0:

  • Tăng giá trị j=j+1
  • Giảm giá trị i=i-1.
  • Gọi f là giá trị lớn nhất thỏa mãn j chia hết cho 2^f, khi đó tiếp tục giảm giá trị i=i-f.

Giá trị N cần tìm chính là 2j.

Độ phức tạp: O(\log(K))

Subtask 3: Ta tiến hành phân tích K thành các thừa số nguyên tố: K=p_1^{a_1} \times p_2^{a_2} \times... \times p_k^{a_k}. Do p_i là các số nguyên tố nên để N! chia hết cho K, N! phải là bội số của các p_i^{a_i}. Gọi N_i là số nhỏ nhất thỏa mãn N_i! chia hết cho p_i^{a_i}, khi đó giá trị N cần tìm là:

N=\max\{N_1,N_2,...,N_k\}

Với mỗi p_i^{a_i}, để tìm giá trị N_i nhỏ nhất, ta có thể sử dụng phương pháp tương tự ở Subtask 2.

Độ phức tạp: O(\sqrt{K}.\log(K))


Comments