หางไก่ (cocktail)

1090

โจทย์ข้อนี้ใช้ combinatorics พื้นฐาน

เราจะนิยาม f[x]f[x] เท่ากับจำนวนไก่ที่มี xx หาง ดังนั้นจำนวนคู่ของไก่ที่ผลรวมหางเท่ากับ A คือ

x=0x=Af[x]f[Ax]\sum_{x=0}^{x=A} f[x]f[A-x]

ถ้าหาก A>200,000A > 200,000 เราสามารถตอบ 0 ได้ทันทีเนื่องจากไก่หนึ่งตัวมีได้อย่างมาก 100,000 หาง

ดังนั้นเราสามารถนับได้ภายใน O(100000)O(100000) ซึ่งถือว่าเร็วมาก

มีข้อระวังสำคัญ คือถ้าหาก AA เป็นเลขคู่ เมื่อ x=A2x = \frac{A}{2} แล้ว f[x]f[x] กับ f[Ax]f[A-x] จะเท่ากัน ทั้งนี้ทำให้เกิดการนับซ้ำเพราะค่าที่ได้จาก f[x]f[Ax]f[x]f[A-x] จะเป็น f[x]Pf[x]_{f[x]}P_{f[x]} แทนที่จะเป็น f[x]Cf[x]_{f[x]}C_{f[x]} ดังนั้นต้องดักเคสนี้ไว้เพื่อคืนค่าเป็น f[x](f[x]1)2\frac{f[x](f[x] - 1)}{2} แทน

สุดท้ายแล้ว อย่าลืมใช้ 64-bit integer เนื่องจากบางเทสเคสอาจมี overflow ได้ (ดูง่ายๆเลยคือถ้าจับทุกคู่จะได้ประมาณ 101210^{12} ซึ่งมากกว่า INT_MAX)