对于范围在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 := 998244353define a function power(), this will take a, b, and return (a^b) mod pfrom 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 := 0for 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 preturn ans
example让我们看下面的实现以获得更好的理解 -
#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;}
input 的中文翻译为:输入2, 2, 2
输出7
以上就是c++程序以找到序列中持有最小和最大元素的成对序列的详细内容。