首页 >后端开发 >C++ >C++程序以找到序列中持有最小和最大元素的成对序列

C++程序以找到序列中持有最小和最大元素的成对序列

WBOY
WBOY转载
2023-09-05 23:29:061201浏览

C++程序以找到序列中持有最小和最大元素的成对序列

假设我们有三个数字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

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++程序以找到序列中持有最小和最大元素的成对序列的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:tutorialspoint.com。如有侵权,请联系admin@php.cn删除