การคำนวณมอดูโลจำนวนเฉพาะ
บวก คูณ และคงค่าไว้ภายในมอดูลัส
การคำนวณมอดูโลจำนวนเฉพาะ เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้โมดูลัส
คำตอบในการแข่งขันอาจมีค่ามหาศาล ใหญ่เกินชนิดจำนวนเต็มใด ๆ ที่มีอยู่ ดังนั้นโจทย์จึงให้หาผลลัพธ์โดยหาเศษด้วยจำนวนเฉพาะขนาดใหญ่ เพื่อควบคุมให้ตัวเลขมีขนาดเล็ก 🔢
ทำความรู้จัก MOD ที่มีชื่อเสียง
จำนวนเฉพาะที่คุณจะพบมากที่สุดคือ 1000000007 ซึ่งมักเขียนเป็น 1e9+7 ค่านี้ใหญ่พอที่จะหลีกเลี่ยงการชนกัน และเล็กพอที่จะเก็บใน 64 บิตได้
MOD = 1000000007โมดูลัสหมายถึงอะไร
ตัวดำเนินการโมดูลัสจะให้เศษที่เหลือหลังการหาร ดังนั้น 17 % 5 จึงเท่ากับ 2 เพราะเมื่อหาร 17 ด้วย 5 จะเหลือเศษ 2
print(17 % 5) # 2การบวกยังอยู่ภายในโมดูลัส
คุณสามารถบวกก่อนแล้วค่อยหาเศษตอนท้าย หรือหาเศษไปเรื่อย ๆ ก็ได้ เศษที่ได้เหมือนกันทั้งสองวิธี ดังนั้นจึงควรลดค่าเป็นระยะเพื่อให้ตัวเลขมีขนาดเล็ก
total = (a + b) % MODการคูณก็ยังอยู่ภายในโมดูลัสเช่นกัน
กฎเดียวกันนี้ใช้กับการคูณด้วย ให้หาผลคูณแล้วหาเศษด้วยจำนวนเฉพาะ Python รองรับจำนวนเต็มขนาดใหญ่โดยตรง แต่การหาเศษจะช่วยให้ทุกค่าเล็กและทำงานได้รวดเร็ว
prod = (a * b) % MODลดค่าหลังทุกขั้นตอน
ในลูปยาว ๆ ให้ใช้ % MOD ในทุกครั้งที่วนซ้ำ วิธีนี้จะป้องกันไม่ให้ตัวเลขขยายใหญ่เกินไป และทำให้แต่ละการดำเนินการมีต้นทุนต่ำและคาดเดาได้
ans = (ans * i) % MODการลบอาจให้ค่าติดลบ
การลบอาจทำให้ได้เศษติดลบในหลายภาษา ให้บวก MOD กลับเข้าไปก่อนหาเศษครั้งสุดท้าย เพื่อให้ผลลัพธ์อยู่ในช่วง 0 ที่ปลอดภัย
diff = (a - b + MOD) % MODโมดูลัสที่เป็นมิตรของ Python
ข่าวดีคือ % ของ Python ให้ผลลัพธ์ที่ไม่ติดลบอยู่แล้วเมื่อโมดูลัสเป็นบวก ดังนั้น -1 % 7 จึงให้ค่า 6 ไม่ใช่ -1 ทำให้ไม่ต้องแก้ค่าเพิ่มเติม
print(-1 % 7) # 6โมดูลัสกระจายผ่านการดำเนินการ
แนวคิดหลักคือ (a op b) % m เท่ากับ (a%m op b%m) % m สำหรับการบวกและการคูณ ดังนั้นคุณจึงลดค่าข้อมูลนำเข้าก่อนนำมารวมกันได้
การหารคือข้อยกเว้น
การบวก การลบ และการคูณทำงานภายใต้โมดูลัสได้อย่างราบรื่น แต่การหารทั่วไปทำไม่ได้ และคุณจะต้องใช้อินเวอร์สแบบโมดูลัสในภายหลังของบทเรียนนี้
กำหนด MOD เพียงครั้งเดียวด้านบน
กำหนด MOD เป็นค่าคงที่ไว้ที่จุดเริ่มต้นของคำตอบ การใช้ชื่อค่าหนึ่งชื่อย่อมดีกว่าการกระจาย 1000000007 ไว้ทั่วโค้ด ซึ่งอาจมีข้อผิดพลาดแฝงอยู่
MOD = 10**9 + 7ตรวจสอบอย่างรวดเร็ว
เหตุใดจึงต้องบวก MOD ก่อนหาเศษของการลบ
ทบทวน
ตอนนี้คุณสามารถควบคุมจำนวนมหาศาลให้มีขนาดเล็กได้ด้วยโมดูลัสจำนวนเฉพาะ เช่น 1e9+7 ให้ลดค่าการบวก การลบ และการคูณในทุกขั้นตอน ระวังค่าเป็นลบ และเก็บการหารไว้ใช้กับอินเวอร์ส 🎯
คำถามที่พบบ่อย
บทเรียน “การคำนวณมอดูโลจำนวนเฉพาะ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคำนวณมอดูโลจำนวนเฉพาะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคำนวณมอดูโลจำนวนเฉพาะ”
บวก คูณ และคงค่าไว้ภายในมอดูลัส คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การคำนวณมอดูโลจำนวนเฉพาะ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม
ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคำนวณมอดูโลจำนวนเฉพาะ
- การยกกำลังมอดูลัสอย่างรวดเร็ว
- อินเวอร์สเชิงมอดูลัสด้วยแฟร์มาต์
- nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า