C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. 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

  2. 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