Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ đếm cặp dãy (A,B) chứa min hàng và max cột

Cho N, M, K. Lưới N x M, mỗi ô ghi số 1..K. A[i] = min hàng i, B[j] = max cột j. Đếm số cặp (A,B) có thể, modulo 998244353.

Ví dụ

Với N=2, M=2, K=2, đầu ra 7.

Giải thuật

Nếu N=1 trả về K^M; nếu M=1 trả về K^N. Ngược lại, duyệt t=1..K (giá trị max của A, min của B). Số cách: (t^N - (t-1)^N) * (K-t+1)^M. Tổng modulo p.

Mã 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, M = 2, K = 2;
    cout << solve(N, M, K) << endl;
}

Đầu vào / Đầu ra

Input: 2, 2, 2
Output: 7