สมมติว่าเรามีจำนวนเต็มสองตัว n และ k เราต้องหาค่าสูงสุดของ x เพื่อให้ n! mod (k^x) =0 ดังนั้นเมื่อ n =5 และ k =2 ผลลัพธ์จะเป็น 3 ดังที่ n! =120 ตอนนี้สำหรับค่า x ที่แตกต่างกัน มันจะเป็น −
120 mod 2^0 =0, 120 mod 2^1 =0, 120 mod 2^2 =0, 120 mod 2^3 =0, 120 mod 2^4 =8, 120 mod 2^5 =24, 120 mod 2^6 =56, 120 mod 2^7 =120 เมื่อค่าสูงสุดของ x =3 ผลลัพธ์จะเป็น 0 ดังนั้นผลลัพธ์คือ 3
เพื่อแก้ปัญหานี้ เราต้องทำตามขั้นตอนเหล่านี้ -
- หารากที่สองของ k แล้วเก็บไว้ใน m
- สำหรับ i :=2 ถึง m ให้ทำตามขั้นตอนต่อไปนี้:
- เมื่อ i =m ให้ตั้งค่า i :=k
- ถ้า k หารด้วย i ลงตัว ให้หาร k ด้วย i
- เรียกใช้ลูปไปที่ n และเพิ่มผลหารให้กับตัวแปรที่เรียกว่า u
- เก็บค่าต่ำสุดของ r หลังจากแต่ละลูป
ตัวอย่าง
#include <iostream> #include <cmath> using namespace std; int calculateMaxX(int n, int k) { int result = n, v, u; int m = sqrt(k) + 1; for (int i = 2; i <= m && k > 1; i++) { if (i == m) { i = k; } for (u = v = 0; k % i == 0; v++) { k /= i; } if (v > 0) { int t = n; while (t > 0) { t /= i; u += t; } result = min(result, u / v); } } return result; } int main() { int n = 5; int k = 2; cout<<"Maximum value of x is: " << calculateMaxX(n, k); }
ผลลัพธ์
Maximum value of x is: 3