您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/12/2 3:16:12发布10次查看
假设我们有三个数字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 := 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++程序以找到序列中持有最小和最大元素的成对序列的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product