nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า
นับการจัดหมู่แบบมอดูลัสจำนวนเฉพาะ
nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
นับจำนวนวิธีเลือก
โจทย์จำนวนมากถามว่ามีวิธีเลือกสมาชิก r ตัวจาก n ตัวได้กี่วิธี ซึ่งเขียนเป็น nCr การแข่งขันต้องการคำนวณจำนวนนั้นภายใต้โมดูลัสจำนวนเฉพาะ 🧮
สูตรแฟกทอเรียล
สูตรพื้นฐานคือ nCr เท่ากับ n แฟกทอเรียล หารด้วย r แฟกทอเรียลคูณด้วย n ลบ r แฟกทอเรียล แต่ปัญหาคือการหารภายใต้โมดูลัส
# nCr = n! / (r! * (n-r)!)แฟกทอเรียลขยายตัวอย่างรวดเร็ว
แฟกทอเรียลเพียงตัวเดียวก็มีค่าเพิ่มขึ้นมหาศาล ดังนั้นให้หาเศษของแต่ละค่าด้วย p วิธีนี้ทำให้ทุกค่ามีขนาดเล็ก ขณะที่สูตรยังคงถูกต้องภายใต้โมดูลัส
คำนวณแฟกทอเรียลทั้งหมดล่วงหน้า
สร้างอาร์เรย์แฟกทอเรียลไว้ครั้งเดียวจนถึงค่า n มากที่สุดที่ต้องใช้ แต่ละสมาชิกมีค่าเท่ากับสมาชิกก่อนหน้าคูณด้วยดัชนี แล้วหาเศษด้วย p ไปเรื่อย ๆ
fact[i] = fact[i-1] * i % MODการหารต้องใช้อินเวอร์ส
สูตรนี้หารด้วยแฟกทอเรียลสองค่า ดังนั้นคุณจึงต้องใช้อินเวอร์สแบบโมดูลัสของทั้งสองค่า โปรดจำไว้ว่าอินเวอร์สจะเปลี่ยนการหารให้เป็นการคูณที่ทำได้อย่างสะอาด
หาอินเวอร์สของแฟกทอเรียลตัวบน
คำนวณอินเวอร์สของแฟกทอเรียลที่มีค่ามากที่สุดเพียงครั้งเดียวด้วยแฟร์มาต์ โดยใช้ pow กับเลขชี้กำลัง p ลบ 2 การเรียกเพียงครั้งเดียวนั้นจะเป็นจุดเริ่มต้นของค่าที่เหลือ
inv_fact[n] = pow(fact[n], MOD - 2, MOD)คำนวณอินเวอร์สย้อนกลับ
หาอินเวอร์สของแฟกทอเรียลตัวอื่น ๆ ด้วยการวนย้อนกลับเพียงครั้งเดียว โดยแต่ละค่าคำนวณจากค่าถัดไปคูณด้วยดัชนี ไม่ต้องเรียก pow เพิ่ม
inv_fact[i] = inv_fact[i+1] * (i+1) % MODประกอบ nCr
ตอนนี้ nCr เป็นเพียง fact[n] คูณด้วย inv_fact[r] คูณด้วย inv_fact[n ลบ r] แล้วหาเศษด้วย p แต่ละคำขอใช้การเข้าถึงข้อมูลสามครั้งและการคูณสองครั้ง
C = fact[n] * inv_fact[r] % MOD * inv_fact[n-r] % MODแต่ละคำขอใช้เวลาเพียงชั่วพริบตา
หลังจากคำนวณล่วงหน้าแล้ว คำตอบของการจัดหมู่แต่ละครั้งใช้เวลา O(1) นี่จึงเป็นรูปแบบที่มีประสิทธิภาพมากเมื่อโจทย์ถามค่า nCr หลายพันค่า
จัดการกรณีขอบ
หาก r ติดลบหรือมากกว่า n คำตอบคือ 0 ให้ตรวจสอบขอบเขตนี้ก่อน เพื่อไม่ให้เข้าถึงตำแหน่งนอกอาร์เรย์แฟกทอเรียล
if r < 0 or r > n: return 0กำหนดขนาดอาร์เรย์เผื่อไว้
กำหนดขนาดอาร์เรย์ให้เท่ากับค่า n สูงสุดจากทุกคำขอ แล้วเผื่อเพิ่มไว้อีกเล็กน้อย ค่าขีดจำกัดที่เล็กเกินไปเป็นสาเหตุทั่วไปของข้อผิดพลาดดัชนีในส่วนนี้
N = 200005ตรวจสอบอย่างรวดเร็ว
หลังจากคำนวณล่วงหน้าแล้ว คำขอ nCr หนึ่งครั้งใช้เวลาเท่าใด
ทบทวน
คุณคำนวณแฟกทอเรียลและอินเวอร์สของแฟกทอเรียลไว้ครั้งเดียว จากนั้นตอบแต่ละ nCr ในเวลา O(1) ด้วยการเข้าถึงข้อมูลสามครั้ง ตรวจสอบขอบเขตของ r และจัดสรรอาร์เรย์ให้มีขนาดเพียงพอ 🏆
คำถามที่พบบ่อย
บทเรียน “nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า”
นับการจัดหมู่แบบมอดูลัสจำนวนเฉพาะ คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคำนวณมอดูโลจำนวนเฉพาะ
- การยกกำลังมอดูลัสอย่างรวดเร็ว
- อินเวอร์สเชิงมอดูลัสด้วยแฟร์มาต์
- nCr ด้วยแฟกทอเรียลที่คำนวณล่วงหน้า