Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมนับลำดับหลังการสลับติดกัน k ครั้ง และไม่เกิน k ครั้งใน Python

มีอาร์เรย์ A = [1..n] หาจำนวนลำดับที่ได้หลังจากการสลับติดกัน (adjacent swaps) ทุก k ครั้ง (S1) และสูงสุด k ครั้ง (S2)

ตัวอย่าง: n=3, k=2 → S1=3, S2=6

ขั้นตอนการแก้ปัญหา

ใช้ DP นับจำนวน permutation ตามจำนวน inversion (สำหรับ adjacent swaps):

  1. A[x] = จำนวน permutation ที่มี inversion = x หลังจากสลับติดกัน k ครั้ง
  2. C[x] = จำนวน permutation ที่มี inversion ≤ x (สำหรับ at most k swaps)
  3. อัปเดต DP โดยใช้ prefix sums และความสัมพันธ์เวียนเกิด

ตัวอย่างโค้ด Python

MOD = 10**9 + 7

def solve(n, k):
    A = [1]
    C = [1]
    for n_val in range(2, n + 1):
        B = A
        A = [1]
        D = C
        C = [1]
        for x in range(1, min(k + 1, n_val * (n_val - 1) // 2 + 1)):
            val = (A[-1] + (B[x] if x < len(B) else 0) - (B[x - n_val] if 0 <= x - n_val else 0)) % MOD
            A.append(val)
        for x in range(1, n_val - 1):
            C.append((D[x] + (n_val - 1) * D[x - 1]) % MOD)
        C.append(n_val * D[-1] % MOD)
    s1 = sum(A[k % 2 : k + 1 : 2]) % MOD
    s2 = C[min(n - 1, k)]
    return s1, s2

# ทดสอบ
n = 3
k = 2
print(solve(n, k))  # ผลลัพธ์: (3, 6)

อินพุตตัวอย่าง

3, 2

เอาต์พุตตัวอย่าง

3, 6