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

C++での複数のクエリにSieveO(log n)を使用した素因数分解


この問題では、複数のクエリに対してSieve O(log n)を使用して素因数分解を計算するプログラムを作成する必要があります。

一般的な方法ではO(sqrt(n))時間がかかるため、複数のクエリから必要な時間が大幅に増加します。

最初に要約しましょう

素因数分解 数の数には素因数のみが含まれ、それらの素因数の積は含まれません。

エラトステネスのふるい は、指定された範囲内のすべての素数を生成するアルゴリズムです。

ソリューションアプローチ

この問題の解決策は、数値を除算する最小の因数を見つけ、それを因数として保存し、それを因数で除算して数値を更新することによって見つけられます。このプロセスは、除算後に数値が1になるまで再帰的に実行されます。つまり、他の要因は不可能です。

計算はエラトステネスのふるいを使用して行われます。 これにより、最小の素因数を見つける際の時間の複雑さが軽減されます。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int primes[100001];

void sieveOfEratosthenes(int N) {
   
   N+=2;
   primes[1] = 1;
   for (int i=2; i<N; i++)
      primes[i] = i;
   for (int i=4; i<N; i+=2)
      primes[i] = 2;
   for (int i=3; i*i<N; i++) {
      if (primes[i] == i) {
         for (int j=i*i; j<N; j+=i)
            if (primes[j]==j)
               primes[j] = i;
      }
   }
}
void findPrimeFactors(int num) {
   
   sieveOfEratosthenes(num);
   int factor;
   while (num != 1) {
      factor = primes[num];
      cout<<factor<<" ";
      num /= factor;
   }
}

int main() {
   int N = 45214;
   cout<<"Prime factorization of the number "<<N<<" using sieve is ";
   findPrimeFactors(N);
   return 0;
}

出力

Prime factorization of the number 45214 using sieve is 2 13 37 47

  1. C ++を使用した、指定された配列のインデックス範囲[L、R]でのビット単位のANDのクエリ

    この記事では、整数の配列が与えられるという問題を与えました。そして、与えられた範囲のビット単位のANDを見つけるように任務を負っています。たとえば、7マイナスです。 Input: arr[ ] = {1, 3, 1, 2, 32, 3, 3, 4, 4}, q[ ] = {{0, 1}, {3, 5}} Output: 1 0 0 1 AND 31 = 1 23 AND 34 AND 4 = 00 Input: arr[ ] = {1, 2, 3, 4, 510, 10 , 12, 16, 8}, q[ ] = {{0, 42}, {1, 33, 4}} Output: 0 8 0 最初にブ

  2. ツリー内のサブツリーのDFSに対するC++クエリ

    この問題では、バイナリツリーが与えられ、特定のノードからdfsを実行する必要があります。このノードでは、指定されたノードをルートとして想定し、そこからdfsを実行します。 上記のツリーで、ノードFからDFSを実行する必要があると仮定します このチュートリアルでは、いくつかの非正統的な方法を適用して、時間計算量を大幅に削減し、より高い制約に対してもこのコードを実行できるようにします。 アプローチ −このアプローチでは、単純な方法ではありません。つまり、より高い制約では機能しないため、すべてのノードにdfsを適用するだけなので、TLEの取得を回避するためにいくつかの非正統的な方法を使用