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

product <=Kのすべてのサブシーケンスをカウントする–C++での再帰的アプローチ


このチュートリアルでは、積<=k。

を持つサブシーケンスの数を見つけるプログラムについて説明します。

このために、配列と値Kが提供されます。私たちのタスクは、積がKであるサブシーケンスの数を見つけることです。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
//keeping count of discarded sub sequences
ll discard_count = 0;
ll power(ll a, ll n){
   if (n == 0)
      return 1;
   ll p = power(a, n / 2);
   p = p * p;
   if (n & 1)
      p = p * a;
   return p;
}
//recursive approach to count
//discarded sub sequences
void solve(int i, int n, float sum, float k,
float* a, float* prefix){
   if (sum > k) {
      discard_count += power(2, n - i);
      return;
   }
   if (i == n)
      return;
      float rem = prefix[n - 1] - prefix[i];
   if (sum + a[i] + rem > k)
      solve(i + 1, n, sum + a[i], k, a, prefix);
   if (sum + rem > k)
      solve(i + 1, n, sum, k, a, prefix);
}
int countSubsequences(const int* arr,
int n, ll K){
   float sum = 0.0;
   float k = log2(K);
   float prefix[n], a[n];
   for (int i = 0; i < n; i++) {
      a[i] = log2(arr[i]);
      sum += a[i];
   }
   prefix[0] = a[0];
   for (int i = 1; i < n; i++) {
      prefix[i] = prefix[i - 1] + a[i];
   }
   ll total = power(2, n) - 1;
   if (sum <= k) {
      return total;
   }
   solve(0, n, 0.0, k, a, prefix);
   return total - discard_count;
}
int main() {
   int arr[] = { 4, 8, 7, 2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   ll k = 50;
   cout << countSubsequences(arr, n, k);
   return 0;
}

出力

9

  1. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7

  2. C++のバイナリツリー内のすべてのノードの積

    ノードを含む二分木が与えられ、タスクは、与えられた二分木のすべてのノードの積を見つけることです。 二分木には、ツリー内のすべてのノードのマスターノードであるルートノードがあります。ノードには、データ部分、左側のサブディレクトリをさらに作成する左側のポインタ、および右側のサブディレクトリの作成に役立つ右側のポインタが含まれています。したがって、ツリーをトラバースするには、左のサブディレクトリをトラバースするための左のポインタまたは右のサブディレクトリをトラバースするための右のポインタに関連付けられる一時的なポインタを使用できます。 入力 出力 Nodes are-: 10, 20,