세 개의 숫자 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