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

C++でNを1に減らすための最大操作を見つける


コンセプト

与えられた2つの数PとQ(PとQは最大10 ^ 6)に関して、数N =(P!/ Q!)を形成します。私たちのタスクは、可能な最大数の操作を実行することにより、Nを1に減らすことです。 NがXで割り切れる場合は、各操作でNをN/Xに置き換えることができます。可能な操作の最大数を決定してください。

入力

A = 7, B = 4

出力

4

説明

Nは210で、除数は2、3、5、7

です。

入力

A = 3, B = 1

出力

2

説明

Nは6、除数は2、3です。

メソッド

数P!/ Q!の因数分解が観察されています。これは、数値の因数分解(Q + 1)*(Q + 2)*…*(P– 1)*Pと同じです。

また、Nを素因数だけで割ると最大の演算数になります。この結果、言い換えると、重複も含むNの素因数の数を決定する必要があります。

2から1000000までのすべての数の因数分解で素因数の数を数えると仮定します。

まず、エラトステネスのふるいを実装します これらの数のそれぞれの素数の約数を決定します。これは次のように説明されます-

  • 2からNまでの連続する整数のリストを作成します:(2、3、4、…、N)。

  • 最初に、pが2、最初の素数に等しいと仮定します。

  • p ^ 2から始めて、pの増分でカウントアップし、リスト内のp^2自体以上のこれらの各数値を示します。したがって、これらの数値はp(p + 1)、p(p + 2)、p(p + 3)などになります。

  • 示されていないリストのpより大きい最初の数を決定します。そのような数がなかったら、やめなさいということがわかっています。それ以外の場合は、pがこの数(次の素数を示す)に等しいと仮定し、手順3から繰り返します。

エラトステネスのふるい法を実装した後、次の式を実装することの因数分解における素因数の数を計算できます-

primefactors [num] =primefactors [num / primedivisor [num]] + 1現在、素因数のプレフィックス合計配列を実装してから、区間[P、Q]の合計に答えることができます。

// CPP program to find maximum
// number moves possible
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
// Used to store number of prime
// factors of each number
int primeFactors1[N];
// Shows Function to find number of prime
// factors of each number
void findPrimeFactors(){
   for (int a = 2; a < N; a++)
   // Now if a is a prime number
   if (primeFactors1[a] == 0)
      for (int b = a; b < N; b += a)
         // Now increase value by one from
         // it's preveious multiple
   primeFactors1[b] = primeFactors1[b / a] + 1;
   // Build prefix sum
   // this will be helpful for
   // multiple test cases
   for (int a = 1; a < N; a++)
      primeFactors1[a] += primeFactors1[a - 1];
}
// Driver Code
int main(){
   // Create primeFactors1 array
   findPrimeFactors();
   int P = 7, Q = 4;
   // required answer
   cout << primeFactors1[P] - primeFactors1[Q];
   return 0;
}

出力

4

  1. C++での最大積4倍の数を見つける

    n個の要素を持つ1つの整数配列があるとします。配列内の4倍の最大積を見つける必要があります。したがって、配列が[3、5、20、6、10]のような場合、最終積は6000であり、4倍の要素は10、5、6、20です。 これを解決するには、次の手順に従います- 配列を昇順で並べ替えます xが最後の4つの要素の積、yが最初の4つの要素の積、zが最初の2つと次の2つの要素の積であると仮定します x、y、zの最大値を返します。 例 #include<iostream> #include<algorithm> using namespace std; int maxQuadP

  2. PythonでNを1に減らす最大の操作を見つける

    2つの数PとQがあり、それらが数N =(P!/ Q!)を形成するとします。可能な最大数の操作を実行して、Nを1に減らす必要があります。各操作で、NがXで割り切れる場合、NをN/Xに置き換えることができます。可能な最大数の操作を返します。 したがって、入力がA =7、B =4の場合、Nは210、除数は2、3、5、7であるため、出力は4になります。 これを解決するには、次の手順に従います- N:=1000005 因数:=サイズNの配列で、0で埋める メインの方法から、次のようにします- 2からNの範囲のiの場合、実行します factor [i]が0と同じ場合、