ก่อนอื่น สังเกตว่าจำนวน inversion ในลำดับขึ้นอยู่กับการเรียงสับเปลี่ยนของความสัมพันธ์ของตัวเลขในลำดับเท่านั้น ลำดับไม่จำเป็นต้องมีตัวเลขเรียงจาก ไป เสมอไป ยกตัวอย่าง กรณีลำดับ สามารถเรียงได้ แบบได้แก่ ได้จำนวน inversion เป็น ตามลำดับ ส่วนลำดับ ก็สามารถเรียงได้จำนวน inversion เป็น ตามลำดับเช่นกัน
ดังนั้น หากกำหนดค่า (จำนวนสมาชิก) และ (จำนวน inversion) ที่ต้องการมาให้ เราสามารถสร้างลำดับ (permutation ของ ) ได้ด้วยการตัดสินใจว่าสมาชิกตัวแรกควรเป็นเลขอะไร ส่วนสมาชิก ตัวที่เหลือ พิจารณาว่าเป็นการสร้างลำดับ ถึง ใหม่ได้ถึงแม้ว่าตัวเลขที่ใช้จริง ๆ แล้วจะเป็นเลขอื่น
สังเกตว่าหากเลือกเอาเลข ขึ้นมาไว้ที่ตำแหน่งแรก เลขนี้จะเกิด inversion ทั้งหมด ครั้งกับเลข ตัวที่เหลือที่จะนำมาใส่ด้านหลัง (ไม่สนใจว่าจะใส่เรียงลำดับยังไง)
การนับจำนวนวิธีสร้างลำดับในข้อนี้จึงสามารถใช้ dynamic programming คำนวณได้
นิยามให้ หมายถึงจำนวนวิธีการสร้างลำดับขนาด สมาชิก ให้ได้จำนวน inversion เท่ากับ จะมี base case ได้แก่
- สำหรับ
- สำหรับ ,
สำหรับ , จะเขียน recurrence formula ได้ว่า
(ตัดสินใจว่าจะให้สมาชิกแรกเป็นเลขอะไรตั้งแต่ เมื่อตัดสินใจแล้ว จะเกิด inversion ขึ้น ดังนั้นจึงพิจารณาสร้างลำดับ ตัวที่เหลือให้มี inversion รวมเป็น )
คำตอบสุดท้ายของโจทย์ข้อนี้คือ
เนื่องจาก และ มีค่ามากถึง วิธีเดิมที่ใช้ Time Complexity และ Space Complexity จึงไม่เหมาะสม
เราสามารถลดเวลาการคำนวณเหลือ ได้โดยนิยาม prefix sum ขึ้นมา ทำให้พจน์ สามารถคำนวณได้อย่างรวดเร็วจาก (ถ้า พจน์ มีค่าเท่ากับ )
สังเกตว่าระหว่างการคำนวณใด ๆ เราสนใจเพียงแค่ 2 แถวสุดท้ายของตาราง และ ดังนั้น เราสามารถลดหน่วยความจำที่ต้องใช้ให้เหลือ โดยเก็บแค่ 2 แถวสุดท้ายไว้เท่านั้น
ทั้งนี้ อย่าลืมคำนวณใน modulo และระมัดระวังไม่ให้เกิดจำนวนติดลบขึ้น