C++で配列の混乱を見つける
1からnまでのn個の数字で構成される配列が昇順であるとすると、生成できる混乱の数を見つける必要があります。
組み合わせ数学では、混乱は集合の要素の順列であり、元の位置に要素が表示されないことを私たちは知っています。答えは非常に大きい可能性があるため、出力mod 10 ^ 9+7を返します。
したがって、入力が3の場合、元の配列は[1,2,3]であるため、出力は2になります。 2つの混乱は[2,3,1]と[3,1,2]です。
これを解決するには、次の手順に従います-
-
m:=10 ^ 9 + 7
-
関数add()を定義します。これには、a、b、
が必要です。 -
return((a mod m)+(b mod m))mod m
-
関数mul()を定義します。これにはa、b、
が必要です。 -
return((a mod m)*(b mod m))mod m
-
メインの方法から次のようにします
-
ret:=0
-
nが1と同じ場合、-
-
0を返す
-
-
nが2と同じ場合、-
-
1を返す
-
-
サイズ(n + 1)の配列dpを定義します
-
dp [2]:=1
-
初期化i:=3の場合、i <=nの場合、更新(iを1増やします)、実行-
-
dp [i]:=mul(i-1、add(dp [i-2]、dp [i-1]))
-
-
dp [n]
を返します
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli m = 1e9 + 7; lli add(lli a, lli b){ return ((a % m) + (b % m)) % m; } lli mul(lli a, lli b){ return ((a % m) * (b % m)) % m; } class Solution { public: int findDerangement(int n) { int ret = 0; if (n == 1) return 0; if (n == 2) return 1; vector dp(n + 1); dp[2] = 1; for (int i = 3; i <= n; i++) { dp[i] = mul(i - 1, add(dp[i - 2], dp[i - 1])); } return dp[n]; } }; main(){ Solution ob; cout<<(ob.findDerangement(3)); }
入力
3
出力
2
-
C ++でSTLを使用して配列の最大要素を見つける方法は?
ここでは、最大要素を見つける方法を説明します。したがって、配列が[12、45、74、32、66、96、21、32、27]の場合、max要素は96です。algorithm.hヘッダーファイルにあるmax_element()関数を使用して、最大要素。 例 #include<iostream> #include<algorithm> using namespace std; int main() { int arr[] = {12, 45, 74, 32, 66, 96, 21, 32, 27}; int n = sizeo
-
C ++を使用して、配列内の数値の頻度を見つけます。
配列があるとします。 n個の異なる要素があります。配列内の1つの要素の頻度を確認する必要があります。 A =[5、12、26、5、3、4、15、5、8、4]とすると、5の頻度を見つけようとすると、3になります。 これを解決するために、左から配列をスキャンします。要素が指定された数と同じである場合は、カウンターを増やします。それ以外の場合は、配列がなくなるまで次の要素に進みます。 例 #include<iostream> using namespace std; int countElementInArr(int arr[], int n, int e) { &nbs