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

โปรแกรม C++ นับคู่ลำดับที่มีค่าต่ำสุดและสูงสุดในแถวและคอลัมน์


คำอธิบายปัญหา

สมมติว่าเรามีตัวเลข 3 ตัวคือ N, M และ K มีแถวนอน N แถว และแถวตั้ง M แถว จะเขียนจำนวนเต็ม 1 ถึง K ในแต่ละเซลล์ กำหนดลำดับ A และ B ว่า:

  • สำหรับ i 1 ถึง N, A[i] คือค่าน้อยที่สุดในแถวที่ i
  • สำหรับ j 1 ถึง M, B[j] คือค่ามากที่สุดในคอลัมน์ที่ j
ต้องการหาจำนวนคู่ (A, B) ถ้าคำตอบใหญ่เกิน ให้ mod 998244353

ตัวอย่าง: N = 2; M = 2; K = 2 ผลลัพธ์คือ 7 คู่ (A[1],A[2],B[1],B[2]) คือ (1,1,1,1), (1,1,1,2), (1,1,2,1), (1,1,2,2), (1,2,2,2), (2,1,2,2), (2,2,2,2)

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

p := 998244353
ฟังก์ชัน power(a, b) คืนค่า a^b mod p
จาก main:
    ถ้า n == 1: คืนค่า power(K, m)
    ถ้า m == 1: คืนค่า power(K, n)
    ans := 0
    สำหรับ t := 1 ถึง K:
        ans := (ans + (power(t, n) - power(t-1, n) + p) mod p * power(K - t + 1, m)) mod p
    คืนค่า ans

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

#include <bits/stdc++.h>
using namespace std;

long p = 998244353;
long power(long a, long b, long ret = 1){
    for (; b; b >>= 1, a = a * a % p)
        if (b & 1) ret = ret * a % p;
    return ret;
}

long solve(int n, int m, int K){
    if (n == 1) return power(K, m);
    if (m == 1) return power(K, n);
    long ans = 0;
    for (long t = 1; t <= K; t++){
        ans = (ans + (power(t, n) - power(t - 1, n) + p) % p * power(K - t + 1, m)) % p;
    }
    return ans;
}

int main(){
    int N = 2;
    int M = 2;
    int K = 2;
    cout << solve(N, M, K) << endl;
}

อินพุต

2, 2, 2

เอาต์พุต

7