ความไม่เท่าเทียมกันของการจัดเรียงใหม่


10

พื้นหลัง

จัดแจงใหม่ความไม่เท่าเทียมกันเป็นความไม่เท่าเทียมกันที่ขึ้นอยู่กับตัวเลขการจัดเรียง หากฉันมีตัวเลขสองรายการที่มีความยาวเท่ากันคือ x 0 , x 1 , x 2 ... x n-1และ y 0 , y 1 , y 2 ... y n-1ของความยาวเดียวกันโดยที่ฉัน ฉันได้รับอนุญาตให้จัดเรียงตัวเลขในรายการอีกวิธีหนึ่งเพื่อเพิ่มผลรวม x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1คือเรียงลำดับ 2 รายการใน คำสั่งไม่ลด

อ่าน บทความWikipediaที่นี่

งาน

คุณจะเขียนโปรแกรมที่รับอินพุตจาก STDIN หรือฟังก์ชั่นที่ยอมรับ 2 อาร์เรย์ (หรือคอนเทนเนอร์ที่เกี่ยวข้อง) ของตัวเลข (ซึ่งมีความยาวเท่ากัน)

สมมติว่าคุณเขียนฟังก์ชันที่ยอมรับ 2 อาร์เรย์ (a และ b) คุณจะพบจำนวนวิธีที่คุณสามารถจัดเรียงตัวเลขในอาร์เรย์ที่สอง (b) เพื่อเพิ่มจำนวนสูงสุด:

a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]

ในกรณีนี้ถ้าอาร์เรย์ b คือ [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (ดัชนีเพื่อความชัดเจน)

[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],

[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (สลับสอง 3)

[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (สลับสองสอง)

[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (สลับสอง 3 และสลับสองสอง)

ถือเป็นการเตรียมการที่แตกต่างกัน อาเรย์ดั้งเดิมเองนั้นยังถือว่าเป็นการจัดเรียงที่เป็นไปได้ถ้ามันยังเพิ่มผลรวมสูงสุด

สำหรับอินพุต STDIN คุณอาจสมมติว่าความยาวของอาร์เรย์มีให้ก่อนอาร์เรย์ (โปรดระบุเพื่อให้คุณใช้) หรืออาร์เรย์นั้นมีให้ในบรรทัดที่แตกต่างกัน (เช่นโปรดระบุด้วย)

นี่คือ 4 อินพุตที่เป็นไปได้ (เพื่อความสะดวก):

5 1 1 2 2 2 1 2 2 3 3 (length before arrays)

1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)

1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)

5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)

สำหรับเอาต์พุตคุณได้รับอนุญาตให้ส่งคืนคำตอบ (ถ้าคุณเขียนฟังก์ชัน) หรือพิมพ์คำตอบไปที่ STDOUT คุณอาจเลือกที่จะส่งออกคำตอบ mod 10 9 +7 (จาก 0 ถึง 10 9 +6) หากสะดวก

กรณีทดสอบ (และคำอธิบาย):

[1 1 2 2 2] [1 2 2 3 3] => 24

2 รายการแรกจะต้องเป็น 1 และ 2 รายการ 3 รายการสุดท้ายคือ 2, 3 และ 3 มี 2 วิธีในการจัดเรียงรายการ 2 รายการระหว่าง 2 รายการแรกและ 2 รายการสุดท้าย ใน 2 รายการแรกมี 2 วิธีในการจัดเรียงใหม่ ใน 2 รายการสุดท้ายมี 6 วิธีในการจัดเรียงใหม่

[1 2 3 4 5] [6 7 8 9 10] => 1

มีทางเดียวเท่านั้นคือการจัดเรียงที่กำหนดไว้ในอาร์เรย์

[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728

ทุกการเปลี่ยนแปลงที่เป็นไปได้ของอาร์เรย์ที่สองนั้นถูกต้อง

ตู้ทดสอบของเดนนิส: Pastebin => 583159312 (mod 1000000007)

เกณฑ์การให้คะแนน:

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดจึงชนะ

ในกรณีที่เสมอกันความสัมพันธ์จะถูกแบ่งตามเวลาที่ส่ง

จดบันทึก:

ภาชนะบรรจุอาจไม่เรียงลำดับ

จำนวนเต็มในคอนเทนเนอร์อาจเป็นศูนย์หรือลบ

โปรแกรมต้องทำงานเร็วพอ (ไม่เกินหนึ่งชั่วโมง) สำหรับอาร์เรย์ที่มีขนาดพอประมาณ (ความยาวประมาณ 10,000)

แรงบันดาลใจจากคำถามนี้ใน Mathematics Stack Exchange


2
โปรดระบุกรณีทดสอบที่มี 10,000 องค์ประกอบต่ออาเรย์เพื่อให้เราสามารถตรวจสอบรหัสของเราทำงานอย่างถูกต้องและเร็วพอ
เดนนิส

1
ในตัวอย่างที่คุณให้การ swaping อาร์เรย์ที่สอง [1_0, 2_2, 2_1, 3_4, 3_3] (สลับสองสองและสลับสองสาม) หายไป
Willem

คุณยอมรับอินพุตเช่น[. . .]ตอบสนอง
ไหม

หากเราส่งฟังก์ชั่นเราต้องแยกอาร์กิวเมนต์สองตัวหรือเราสามารถใช้อาร์เรย์ได้หรือไม่?
Dennis

อาร์เรย์อาร์เรย์ดูเหมือนว่าดีและไม่ส่งผลกระทบต่อความท้าทายมากนัก ฉันจะทำงานในกรณีทดสอบ
Element118

คำตอบ:


4

CJam, 30 26 ไบต์

q~](/:$_za+{e`0f=:m!:*}//*

ลองใช้ออนไลน์ในล่าม CJam

มันเสร็จสิ้นกรณีทดสอบนี้ในเวลาน้อยกว่าหนึ่งวินาที:

$ time cjam <(echo 'q~](/:$_za+{e`0f=:m!:*}%)\:*\/N') < test-large.in | md5sum
5801bbf8ed0f4e43284f7ec2206fd3ff  -

real    0m0.308s
user    0m0.667s
sys     0m0.044s

การเรียกใช้ในล่ามออนไลน์ควรใช้เวลาน้อยกว่า 10 วินาที

ขั้นตอนวิธี

ผลลัพธ์ไม่ขึ้นอยู่กับคำสั่งของAดังนั้นเราจึงสามารถสันนิษฐานได้ว่าจะเรียงลำดับ ซึ่งหมายความว่าต้องเรียงลำดับเพื่อให้ได้ผลิตภัณฑ์จุดสูงสุด

ทีนี้ถ้าr 1 , … r nคือความยาวของการวิ่งของเรียงA , จะมี∏r k ! การจัดเรียงองค์ประกอบต่าง ๆ ของAที่แตกต่างกันซึ่งยังคงส่งผลให้ลำดับขึ้น

ในทำนองเดียวกันถ้าs 1 , … s nคือความยาวของการวิ่งของB ที่เรียงลำดับแล้วจะมี∏s k ! การจัดเรียงองค์ประกอบต่าง ๆ ของBที่แตกต่างกันซึ่งยังคงส่งผลให้ลำดับขึ้น

อย่างไรก็ตามสิ่งนี้นับการจับคู่ทั้งหมดหลายครั้ง ถ้าเราใช้คู่ขององค์ประกอบที่สอดคล้องกันของการเรียงAและเรียงBและกำหนดt 1 , … t nเป็นความยาวของการวิ่งของอาร์เรย์ผลลัพธ์, resultingt k ! เป็นตัวคูณดังกล่าว

ดังนั้นผลที่ต้องการคือ(Πr k !) × (Πs k !) ÷ (Πt k !)

รหัส

 q~                          Read and evaluate all input.
   ]                         Wrap the resulting integers in an array.
    (                        Shift out the first (length).
     /                       Split the remainder into chunks of that length.
      :$                     Sort each chunk.
        _z                   Push a copy and transpose rows with columns.
                             This pushes the array of corresponding pairs.
          a+                 Wrap in array and concatenate (append).
            {          }/    For A, B, and zip(A,B):
             e`                Perform run-length encoding.
               0f=             Select the runs.
                  :m!          Apply factorial to each.
                     :*        Reduce by multiplication.
                         /   Divide the second result by the third.
                          *  Multiply the quotient with the first result.

6

Pyth, 29 28 ไบต์

M/*FPJm*F.!MhMrd8aFCB,SGSHeJ

ลองใช้ออนไลน์ในPyth คอมไพเลอร์

ขั้นตอนวิธี

ผลลัพธ์ไม่ขึ้นอยู่กับคำสั่งของAดังนั้นเราจึงสามารถสันนิษฐานได้ว่าจะเรียงลำดับ ซึ่งหมายความว่าต้องเรียงลำดับBเพื่อให้ได้ผลิตภัณฑ์จุดสูงสุด

ทีนี้ถ้าr 1 , … r nคือความยาวของการวิ่งของเรียงA , จะมี∏r k ! การจัดเรียงองค์ประกอบต่าง ๆ ของAที่แตกต่างกันซึ่งยังคงส่งผลให้ลำดับขึ้น

ในทำนองเดียวกันถ้าs 1 , … s nคือความยาวของการวิ่งของB ที่เรียงลำดับแล้วจะมี∏s k ! การจัดเรียงองค์ประกอบต่าง ๆ ของBที่แตกต่างกันซึ่งยังคงส่งผลให้ลำดับขึ้น

อย่างไรก็ตามสิ่งนี้นับการจับคู่ทั้งหมดหลายครั้ง ถ้าเราใช้คู่ขององค์ประกอบที่สอดคล้องกันของการเรียงAและเรียงBและกำหนดt 1 , … t nเป็นความยาวของการวิ่งของอาร์เรย์ผลลัพธ์, resultingt k ! เป็นตัวคูณดังกล่าว

ดังนั้นผลลัพธ์ที่ต้องการคือ(kr k !) × (∏s k !) ÷ (∏t k !) !)

รหัส

M/*FPJm*F.!MhMrd8aFCB,SGSHeJ

M                             Define g(G,H):
                      SGSH      Sort G and H.
                     ,          For the pair of the results.
                   CB           Bifurcated zip (C).
                                This returns [[SG, SH], zip([SG, SH])].
                 aF             Reduce by appending.
                                This returns [SG, SH, zip([SG, SH])].
      m                         Map; for each d in the resulting array:
              rd8                 Perform run-length encoding on d.
            hM                    Mapped "head". This returns the lengths.
         .!M                      Mapped factorial.
       *F                         Reduce by multiplication.
     J                          Save the result in J.
    P                           Discard the last element.
  *F                            Reduce by multiplication.
 /                  
                          eJ    Divide the product by the last element of J.
                                Return the result of the division.

การตรวจสอบ

ฉันได้สร้างกรณีทดสอบความยาว 6 แบบหลอกหลอก 100 รายการซึ่งฉันได้แก้ไขด้วยโค้ดด้านบนและวิธีการบังคับแบบเดรัจฉาน:

Ml.Ms*VGZ.pH

M             Define g(G,H) (or n(G,H) on second use):
         .pH    Compute all permutations of H.
  .M            Filter .pH on the maximal value of the following;
                 for each Z in .pH:
     *VGZ         Compute the vectorized product of G and Z.
    s             Add the products.
                  This computes the dot product of G and Z.
 l              Return the length of the resulting array.

ผลลัพธ์เหล่านี้คือ:

$ cat test.in
6,9,4,6,8,4,5,6,5,0,8,2
0,7,7,6,1,6,1,7,3,3,8,0
3,6,0,0,6,3,8,2,8,3,1,1
2,3,0,4,0,6,3,4,5,8,2,4
9,1,1,2,2,8,8,1,7,4,9,8
8,3,1,1,9,0,2,8,3,4,9,5
2,0,0,7,7,8,9,2,0,6,7,7
0,7,4,2,2,8,6,5,0,5,4,9
2,7,7,5,5,6,8,8,0,5,6,3
1,7,2,7,7,9,9,2,9,2,9,8
7,2,8,9,9,0,7,4,6,2,5,3
0,1,9,2,9,2,9,5,7,4,5,6
8,4,2,8,8,8,9,2,5,4,6,7
5,2,8,1,9,7,4,4,3,3,0,0
9,3,6,2,5,5,2,4,6,8,9,3
4,2,0,6,2,3,5,3,6,3,1,4
4,8,5,2,5,0,5,1,2,5,9,5
6,8,4,4,9,5,9,5,4,2,8,7
8,9,8,1,2,2,9,0,5,6,4,9
4,7,6,8,0,3,7,7,3,9,8,6
7,5,5,6,3,9,3,8,8,4,8,0
3,8,1,8,5,6,6,7,2,8,5,3
0,9,8,0,8,3,0,3,5,9,5,6
4,2,7,7,5,8,4,2,6,4,9,4
3,5,0,8,2,5,8,7,3,4,5,5
7,7,7,0,8,0,9,8,1,4,8,6
3,9,7,7,4,9,2,5,9,7,9,4
4,5,5,5,0,7,3,4,0,1,8,2
7,4,4,2,5,1,7,4,7,1,9,1
0,6,2,5,4,5,1,8,0,8,9,9
3,8,5,3,2,1,1,2,2,2,8,4
6,1,9,1,8,7,5,6,9,2,8,8
6,2,6,6,6,0,2,7,8,6,8,2
0,7,1,4,5,5,3,4,4,0,0,2
6,0,1,5,5,4,8,5,5,2,1,6
2,6,3,0,7,4,3,6,0,5,4,9
1,4,8,0,5,1,3,2,9,2,6,5
2,7,9,9,5,0,1,5,6,8,4,6
4,0,1,3,4,3,6,9,1,2,7,1
6,5,4,7,8,8,6,2,3,4,1,2
0,3,6,3,4,0,1,4,5,5,5,7
5,4,7,0,1,3,3,0,2,1,0,8
8,6,6,1,6,6,2,2,8,3,2,2
7,1,3,9,7,4,6,6,3,1,5,8
4,8,3,3,9,1,3,4,1,3,0,6
1,4,0,7,4,9,8,4,2,1,0,3
0,4,1,6,4,4,4,7,5,1,4,2
0,0,4,4,9,6,7,2,7,7,5,4
9,0,5,5,0,8,8,9,5,9,5,5
5,7,0,4,2,7,6,1,1,1,9,1
3,1,7,5,0,3,1,4,0,9,0,3
4,4,5,7,9,5,0,3,7,4,7,5
7,9,7,3,0,8,4,0,0,3,1,0
2,4,4,3,1,2,5,2,9,0,8,5
4,8,7,3,0,0,9,3,7,3,0,6
8,9,1,0,7,7,6,0,3,1,8,9
8,3,1,7,3,3,6,1,1,7,6,5
6,5,6,3,3,0,0,5,5,0,6,7
2,4,3,9,7,6,7,6,5,6,2,0
4,8,5,1,8,4,4,3,4,5,2,5
7,5,0,4,6,9,5,0,5,7,5,5
4,8,9,5,5,2,3,1,9,7,7,4
1,5,3,0,3,7,3,8,5,5,3,3
7,7,2,6,1,6,6,1,3,5,4,9
9,7,6,0,1,4,0,4,4,1,4,0
3,5,1,4,4,0,7,1,8,9,9,1
1,9,8,7,4,9,5,2,2,1,2,9
8,1,2,2,7,7,6,8,2,3,9,7
3,5,2,1,3,5,2,2,4,7,0,7
9,6,8,8,3,5,2,9,8,7,4,7
8,8,4,5,5,1,5,6,5,1,3,3
2,6,3,5,0,5,0,3,4,4,0,5
2,2,7,6,3,7,1,4,0,3,8,3
4,8,4,2,6,8,5,6,2,5,0,1
7,2,4,3,8,4,4,6,5,3,9,4
4,6,1,0,6,0,2,6,7,4,9,5
6,3,3,4,6,1,0,8,6,1,7,5
8,3,4,2,8,3,0,1,8,9,1,5
9,6,1,9,1,1,8,8,8,9,1,4
3,6,1,6,1,4,5,1,0,1,9,1
6,4,3,9,3,0,5,0,5,3,2,4
5,2,4,6,1,2,6,0,1,8,4,0
3,5,7,6,3,6,4,5,2,8,1,5
6,3,6,8,4,2,7,1,5,3,0,6
9,1,5,9,9,1,1,4,5,7,3,0
1,6,7,3,5,8,6,5,5,2,6,0
2,8,8,6,5,5,2,3,8,1,9,8
0,4,5,3,7,6,2,5,4,3,2,5
5,1,2,3,0,3,4,9,4,9,4,9
5,8,2,2,0,2,4,1,1,7,0,3
0,6,0,0,3,6,3,6,2,2,2,9
2,4,8,1,9,4,0,8,8,0,4,7
3,9,1,0,5,6,8,8,2,5,2,6
5,3,8,9,1,6,5,9,7,7,6,1
8,6,9,6,1,1,6,7,7,3,2,2
7,2,1,9,8,8,5,3,6,3,3,6
9,9,4,8,7,9,8,6,6,0,3,1
8,3,0,9,1,7,4,8,0,1,6,2
8,2,6,2,4,0,2,8,9,6,3,7
1,0,8,5,3,2,3,7,1,7,8,2
$ while read; do
> pyth -c 'M/*FPJm*F.!MhMrd8aFCB,SGSHeJMl.Ms*VGZ.pHAc2Q,gGHnGH' <<< "$REPLY"
> done < test.in
[4, 4]
[4, 4]
[8, 8]
[4, 4]
[8, 8]
[2, 2]
[4, 4]
[4, 4]
[4, 4]
[36, 36]
[2, 2]
[8, 8]
[24, 24]
[8, 8]
[2, 2]
[2, 2]
[6, 6]
[2, 2]
[8, 8]
[2, 2]
[12, 12]
[2, 2]
[8, 8]
[12, 12]
[4, 4]
[12, 12]
[4, 4]
[6, 6]
[8, 8]
[8, 8]
[6, 6]
[4, 4]
[48, 48]
[8, 8]
[4, 4]
[1, 1]
[4, 4]
[4, 4]
[8, 8]
[4, 4]
[12, 12]
[2, 2]
[96, 96]
[2, 2]
[4, 4]
[2, 2]
[6, 6]
[24, 24]
[24, 24]
[48, 48]
[4, 4]
[8, 8]
[12, 12]
[8, 8]
[4, 4]
[2, 2]
[24, 24]
[16, 16]
[2, 2]
[8, 8]
[24, 24]
[4, 4]
[24, 24]
[4, 4]
[12, 12]
[8, 8]
[12, 12]
[4, 4]
[8, 8]
[4, 4]
[16, 16]
[4, 4]
[8, 8]
[8, 8]
[4, 4]
[4, 4]
[4, 4]
[4, 4]
[72, 72]
[24, 24]
[4, 4]
[4, 4]
[4, 4]
[2, 2]
[12, 12]
[4, 4]
[8, 8]
[4, 4]
[36, 36]
[6, 6]
[12, 12]
[8, 8]
[4, 4]
[2, 2]
[8, 8]
[24, 24]
[6, 6]
[1, 1]
[2, 2]
[2, 2]

เพื่อตรวจสอบความพึงพอใจการส่งของฉันต้องการความเร็วที่ผมเคยขับรถกับกรณีการทดสอบนี้

$ time pyth -c 'M/*FPJm*F.!MhMrd8aFCB,SGSHeJAc2QgGH' < test-large.in | md5sum
5801bbf8ed0f4e43284f7ec2206fd3ff  -

real    0m0.233s
user    0m0.215s
sys     0m0.019s

2

Matlab ขนาด 230 ไบต์

แก้ไข: มีหลายสิ่งที่แก้ไขเพื่อให้ตรงกับกรณีทดสอบของเดนนิสและ nnz จะถูกแทนที่ด้วย numel เนื่องจากค่าศูนย์

f=1;t=-1;q=1;a=sort(input(''));b=sort(input(''));for i=unique(a)c=b(find(a==i));r=numel(c(c==t));f=f*factorial(numel(c))*sum(arrayfun(@(u)nchoosek(max(q,r),u),0:min(q,r)));z=c(end);y=numel(c(c==z));q=(t==z)*(q+r)+(t~=z)*y;t=z;end,f

การกระทำ

[2 2 1 2 1]
[3 2 3 2 1]

f =

    24

ตู้ทดสอบของ Dennis:

   A = importdata('f:\a.csv'); for i=1:100,a=sort(A(i,1:6));b=sort(A(i,7:12));
   f=1;t=-1;q=1;for i=unique(a)c=b(find(a==i));r=numel(c(c==t));f=f*factorial(numel(c))*sum(arrayfun(@(u)nchoosek(max(q,r),u),0:min(q,r)));z=c(end);y=numel(c(c==z));q=(t==z)*(q+r)+(t~=z)*y;t=z;end;
   disp(f);end

ขาออก:

 4

 4

 8

 4

 8

 2

 4

 4

 4

36

 2

 8

24

 8

 2

 2

 6

 2

 8

 2

12

 2

 8

12

 4

12

 4

 6

 8

 8

 6

 4

48

 8

 4

 1

 4

 4

 8

 4

12

 2

96

 2

 4

 2

 6

24

24

48

 4

 8

12

 8

 4

 2

24

16

 2

 8

24

 4

24

 4

12

 8

12

 4

 8

 4

16

 4

 8

 8

 4

 4

 4

 4

72

24

 4

 4

 4

 2

12

 4

 8

 4

36

 6

12

 8

 4

 2

 8

24

 6

 1

 2

 2

มันแก้ปัญหาได้ดังนั้นอินพุตไม่ควรสำคัญมากเกินไป
Element118

1

C ++, 503 ไบต์

(เพื่อความสนุกสนานภาษาที่ไม่ใช่กอล์ฟ)

#import<iostream>
#import<algorithm>
#define U 12345
#define l long long
using namespace std;int N,X=1,Y=1,Z=1,x[U],y[U],i=1;l p=1,M=1000000007,f[U];l e(l x,int y){return y?y%2?(x*e(x,y-1))%M:e((x*x)%M,y/2):1;}main(){for(f[0]=1;i<U;i++)f[i]=(f[i-1]*i)%M;cin>>N;for(i=0;i<N;i++)cin>>x[i];for(i=0;i<N;i++)cin>>y[i];sort(x,x+N);sort(y,y+N);for(i=1;i<N;i++)x[i]^x[i-1]?p=p*f[X]%M,X=1:X++,y[i]^y[i-1]?p=p*f[Y]%M,Y=1:Y++,x[i]^x[i-1]|y[i]^y[i-1]?p=p*e(f[Z],M-2)%M,Z=1:Z++;cout<<p*f[X]%M*f[Y]%M*e(f[Z],M-2)%M;}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

#include <cstdio>
#include <algorithm>
#define MOD 1000000007
using namespace std;
int N; // number of integers
int x[1000010]; // the 2 arrays of integers
int y[1000010];
long long product = 1;
long long factorial[1000010]; // storing factorials mod 1000000007
long long factorialInv[1000010]; // storing the inverse mod 1000000007
long long pow(long long x, int y) {
    if (y == 0) return 1;
    if (y == 1) return x;
    if (y%2 == 1) return (x*pow(x, y-1))%MOD;
    return pow((x*x)%MOD, y/2);
}
int main(void) {
    //freopen("in.txt", "r", stdin); // used for faster testing
    //precomputation
    factorial[0] = factorial[1] = 1;
    for (int i=2;i<=1000000;i++) {
        factorial[i] = (factorial[i-1]*i)%MOD;
        factorialInv[i] = pow(factorial[i], MOD-2);
    }
    // input
    scanf("%d", &N);
    for (int i=0;i<N;i++) {
        scanf("%d", &x[i]);
    }
    for (int i=0;i<N;i++) {
        scanf("%d", &y[i]);
    }
    // sort the 2 arrays
    sort(x, x+N);
    sort(y, y+N);
    int sameX = 1;
    int sameY = 1;
    int sameXY = 1;
    for (int i=1;i<N;i++) {
        if (x[i]==x[i-1]) {
            sameX++;
        } else {
            product *= factorial[sameX];
            product %= MOD;
            sameX = 1;
        }
        if (y[i]==y[i-1]) {
            sameY++;
        } else {
            product *= factorial[sameY];
            product %= MOD;
            sameY = 1;
        }
        if (x[i]==x[i-1] && y[i]==y[i-1]) {
            sameXY++;
        } else {
            product *= factorialInv[sameXY];
            product %= MOD;
            sameXY = 1;
        }
    }
    product *= factorial[sameX];
    product %= MOD;
    product *= factorial[sameY];
    product %= MOD;
    product *= factorialInv[sameXY];
    product %= MOD;
    printf("%lld\n", product);
    return 0;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.