シーケンスが最小要素と最大要素を保持するシーケンスのペアを見つけるためのC++プログラム
N、M、Kの3つの数値があるとします。N個の水平方向の行とM個の垂直方向の行があります。各セルに1からKまでの整数を書き込み、-
のようにシーケンスAとBを定義します。-
1からNの範囲の各iについて、A[i]はi番目の行のすべての要素の最小値です
-
1からMの範囲の各jについて、B[j]はj番目の列のすべての要素の最大値です
ペアの数(A、B)を見つける必要があります。答えが大きすぎる場合は、結果mod998244353を返します。
したがって、入力がN=2のような場合。 M =2; K =2の場合、(A [1]、A [2]、B [1]、B [2])は(1,1,1,1)、(1,1、)であるため、出力は7になります。 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 ++のバイナリツリーで最大(または最小)を見つける
この問題では、二分木が与えられます。私たちのタスクは、バイナリツリーで最大(または最小)を見つけることです。 問題の説明: 二分木で最大値と最小値を持つ二分木のノードを見つける必要があります。 問題を理解するために例を見てみましょう。 入力: 出力: 最大=9、最小=1 ソリューションアプローチ 二分木の最大ノードを見つける必要があります。これを行うには、リーフノードに到達するまでポインタを移動し、ツリーの最大ノードを見つけます。 ソリューションの動作を説明するプログラム 例 #include <iostream> using namespace s
-
配列内の最大要素と最小要素を見つけるC#プログラム
すべての要素を比較できるように、最小要素と最大要素を最初の要素に設定します。 最大に。 if(arr[i]>max) { max = arr[i]; } 最低限。 if(arr[i]<min) { min = arr[i]; } 次のコードを実行して、最大要素と最小要素の位置を見つけることができます。 例 using System; public class Demo { public static void Main() { int[] arr = new