假設我們有三個數字N、M和K。有N個水平行和M個垂直行。我們將在每個單元格中寫入1到K之間的整數,並定義序列A和B,使得−
對於範圍在1到N之間的每個i,A[i]是第i行中所有元素的最小值
對於範圍在1到M之間的每個j,B[j]是第j列中所有元素的最大值
我們需要找到(A, B)的數量。如果答案太大,回傳結果模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 Define a function power(), this will take a, b, and return (a^b) mod p From the main method, do the following: if n is same as 1, then: return power(K, m) if m is same as 1, then: return power(K, n) ans := 0 for initialize t := 1, when t <= K, update (increase t by 1), do: ans := (ans + (power(t, n) - power(t - 1, n) + p) mod p * power(K - t + 1, m)) mod p return ans
讓我們看下面的實作以獲得更好的理解-
#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
以上是C++程式以找出序列中持有最小和最大元素的成對序列的詳細內容。更多資訊請關注PHP中文網其他相關文章!