Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาการดำเนินการสูงสุดเพื่อลด N ถึง 1 ใน C++


แนวคิด

ด้วยความเคารพของสองตัวเลขที่ให้มา P และ Q ( P และ Q สามารถมีค่าได้ถึง 10^6 ) ซึ่งสร้างตัวเลขN =(P!/Q!) หน้าที่ของเราคือลด N เป็น 1 โดยดำเนินการตามจำนวนการดำเนินการสูงสุดที่เป็นไปได้ โปรดจำไว้ว่า ในแต่ละการดำเนินการ เราสามารถแทนที่ N ด้วย N/X ถ้า 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

ขั้นแรก ใช้ ตะแกรงของ Eratosthenes เพื่อหาตัวหารเฉพาะของตัวเลขแต่ละตัว มีคำอธิบายดังนี้ −

  • สร้างรายการจำนวนเต็มตั้งแต่ 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

หลังจากใช้วิธี Sieve of Eratosthenes เราสามารถคำนวณจำนวนปัจจัยเฉพาะในการแยกตัวประกอบของการใช้สูตรต่อไปนี้ -

ไพรม์แฟคเตอร์[num] =ไพรม์แฟกเตอร์[num / primedivisor[num]] + 1 ณ ปัจจุบัน เราสามารถใช้ prefix sum array สำหรับปัจจัยเฉพาะแล้วตอบสำหรับช่วงผลรวม [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