nCr باستخدام المضروبات المحسوبة مسبقًا
عدّ التوليفات بترديد عدد أولي
nCr باستخدام المضروبات المحسوبة مسبقًا درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
عدّ التوافيق
تسأل العديد من المسائل عن عدد طرق اختيار r عنصرًا من n، ويُكتب ذلك nCr. وتطلب مسابقات البرمجة حساب هذا العدد تحت modulus أولي. 🧮
صيغة المضروب
الصيغة الكلاسيكية هي أن nCr يساوي مضروب n مقسومًا على حاصل ضرب مضروب r ومضروب n ناقص r. لكن المشكلة هي القسمة تحت modulo.
# nCr = n! / (r! * (n-r)!)تنفجر قيم المضروب
ينمو المضروب الواحد نموًا فلكيًا، لذا احسب modulo p لكل مضروب. يحافظ ذلك على صغر كل قيمة مع بقاء الصيغة دقيقة تحت modulus.
احسب جميع قيم المضروب مسبقًا
أنشئ مصفوفة fact مرة واحدة حتى أكبر قيمة n تحتاج إليها. يساوي كل عنصر العنصر السابق مضروبًا في الفهرس، مع حساب modulo p في كل خطوة.
fact[i] = fact[i-1] * i % MODالقسمة تحتاج إلى معكوسات
تقسم الصيغة على مضروبين، لذا تحتاج إلى معكوسَي modulo لهما. تذكّر أن المعكوس يحوّل القسمة إلى ضرب مباشر.
احسب معكوس المضروب الأكبر
احسب معكوس أكبر مضروب مرة واحدة باستخدام Fermat، وذلك باستعمال 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 minus r]، مع حساب modulo 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 بين جميع الاستعلامات مع إضافة هامش صغير. يمثل limit الأصغر من اللازم سببًا شائعًا لأخطاء الفهارس هنا.
N = 200005تحقق سريع
بعد الحساب المسبق، ما سرعة استعلام nCr واحد؟
مراجعة
تحسب مسبقًا المضروبات ومعكوساتها مرة واحدة، ثم تجيب عن كل nCr في O(1) باستخدام ثلاث عمليات وصول. تحقّق من حدود r واجعل المصفوفات كبيرة بما يكفي. 🏆
الأسئلة الشائعة
هل درس «nCr باستخدام المضروبات المحسوبة مسبقًا» مجاني؟
نعم — نص درس «nCr باستخدام المضروبات المحسوبة مسبقًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
ماذا ستتعلم في «nCr باستخدام المضروبات المحسوبة مسبقًا»؟
عدّ التوليفات بترديد عدد أولي تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟
لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «nCr باستخدام المضروبات المحسوبة مسبقًا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟
نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- العمل بترديد عدد أولي
- الرفع السريع للقوى بترديد
- المعكوس الترديدي باستخدام فيرما
- nCr باستخدام المضروبات المحسوبة مسبقًا