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

ผลิตภัณฑ์ย่อยของขนาด K ทั้งหมดยกเว้นองค์ประกอบต่ำสุดและสูงสุดใน C++


กำหนดอาร์เรย์ arr[n] ซึ่งประกอบด้วยจำนวน n จำนวนเต็มและจำนวนเต็ม k สำหรับกำหนดขนาด งานคือการพิมพ์ผลิตภัณฑ์ของลำดับย่อยทั้งหมดของขนาด k ยกเว้นองค์ประกอบต่ำสุดและสูงสุด

สมมติว่าเรามีชุดขององค์ประกอบ 4 รายการ {1, 2, 3, 4} และ k เป็น 2 ดังนั้นชุดย่อยจะเป็น −{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 3}, {2, 4}

ดังนั้นหากไม่รวมองค์ประกอบสูงสุด 4 และองค์ประกอบขั้นต่ำ 1 องค์ประกอบที่เหลือจะเป็น −

2, 3, 3, 3, 2 ซึ่งเป็นผลคูณของ −

2 * 3 * 3 * 3 * 2 =108

ในทำนองเดียวกันเราต้องแก้ปัญหา

ตัวอย่าง

Input: arr[] = {3, 4, 1, 7}, k = 3
Output: 144
Explanation: subset will be, {3, 4, 1}, {4, 1, 7}, {3, 1, 7}, {3, 4, 7}
Eliminating maximum value 7 and minimum 1 we will get:
{3, 4}, {4}, {3}, {3, 4}, so multiplying these will give us:
3 * 4 * 4 * 3 = 144

Input: arr[] = {1, 2, 3, 4}, k = 3
Output: 36

แนวทางที่เราใช้เพื่อแก้ปัญหาข้างต้น

มีหลายวิธีในการบรรลุการแก้ปัญหา มีแนวทางหนึ่งที่เราสามารถสร้างลำดับย่อยที่เป็นไปได้ทั้งหมดทีละรายการ และสร้างผลิตภัณฑ์องค์ประกอบทั้งหมดยกเว้นค่าสูงสุดและค่าต่ำสุดของชุด ถึงแม้ว่าวิธีนี้จะทำได้ง่ายแต่มีความซับซ้อนสูงมากและไม่มีประสิทธิภาพ

เรามีแนวทางที่มีประสิทธิภาพเช่นกัน ในแนวทางนี้เราจะเรียงลำดับอาร์เรย์ก่อน โดยไม่คำนึงถึงชุดย่อยหรือชุดย่อยที่จะพิจารณาหรือไม่

จากนั้นเราจะนับจำนวนการเกิดขึ้นของแต่ละองค์ประกอบทีละรายการ

ตัวเลขอาจเกิดขึ้น C(k-1) (n-1) ลำดับที่ C(k-1) (i) ครั้งเราจะเกิดองค์ประกอบสูงสุด C(k-1) (n-i-1) ครั้งที่จะเกิดขึ้น เป็นองค์ประกอบขั้นต่ำของลำดับนั้น

ดังนั้น เราสามารถระบุได้ว่าวิธีนี้เป็นวิธีที่มีประสิทธิภาพมากกว่าเนื่องจากองค์ประกอบ ith จะเกิดขึ้น -

C(k-1) (n-1)- C(k-1) (i)- C(k-1) (n-i-1) ครั้ง

ขั้นแรกเราจะแก้ x สำหรับแต่ละองค์ประกอบใน arr[i] ดังนั้นคำตอบของมันจึงเป็นเรื่องยากที่จะคำนวณ เราจึงสามารถใช้ทฤษฎีบทน้อยของ Fermat ได้

หมายเหตุ −เนื่องจากคำตอบอาจมีขนาดใหญ่มาก ดังนั้นเราจะพิมพ์คำตอบใน mod 109+7

อัลกอริทึม

Start
Step 1-> Declare function to calculate the pairs combination
   void pairs(int a, int b)
   Declare int i, j
   Loop For i = 0 and i <= a and i++
      Loop For j = 0 and j <= min(i, b) and j++
         IF (j == 0 || j == i)
            Set c[i][j] = 1
         End
         Else
            Set c[i][j] = (c[i - 1][j - 1] % val + c[i - 1][j] % val) % val
         End
      End
   End
Step 2-> declare function for power
   LL power(LL x, unsigned LL y)
   Declare unsigned LL temp = 1
   Set x = x % val
   Loop While (y > 0)
      IF(y & 1)
         Set temp = (temp * x) % val
      End
      Set y = y >> 1
      Set x = (x * x) % val
   End
   return temp % val
Step 3-> Declare function to calculate product of all subsequences
   unsigned LL product(LL arr[], int size, int k)
   Declare and set unsigned LL temp = 1
   Call function to sort an array as sort(arr, arr + size)
   Declare and set as LL pow = c[size - 1][k - 1]
   Loop For i = 0 and i < size and i++
      Declare and set LL pow_l = c[i][k - 1]
      Declare and set LL pow_f = c[size - i - 1][k - 1]
      Declare and set LL pow_e = ((pow % val) - (pow_l + pow_f) % val + val) % val
      Declare and set unsigned LL mul = power(arr[i], pow_e) % val
      Set temp = ((temp % val) * (mul % val)) % val
   End
   return temp % val
Step 4-> In main()
   Call pairs(100, 100)
   Declare and set LL arr[] = { 3, 4, 1, 7 }
   Calculate size as int size = sizeof(arr) / sizeof arr[0]
   Declare and set int k = 3
   Declare and set unsigned LL temp = product(arr, size, k)
   Print temp
Stop

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
#define val 1000000007
#define LL long long
#define max 101
LL c[max - 1][max - 1];
LL power(LL x, unsigned LL y) {
   unsigned LL temp = 1;
   x = x % val;
   while (y > 0) {
      if (y & 1) {
         temp = (temp * x) % val;
      }
      y = y >> 1;
      x = (x * x) % val;
   }
   return temp % val;
}
void pairs(int a, int b) {
   int i, j;
   for (i = 0; i <= a; i++) {
      for (j = 0; j <= min(i, b); j++) {
         if (j == 0 || j == i)
            c[i][j] = 1;
         else
            c[i][j] = (c[i - 1][j - 1] % val + c[i - 1][j] % val) % val;
      }
   }
}
//function to calculate product of all subsequences
unsigned LL product(LL arr[], int size, int k) {
   unsigned LL temp = 1;
   //sorting array
   sort(arr, arr + size);
   LL pow = c[size - 1][k - 1];
   for (int i = 0; i < size; i++) {
      LL pow_l = c[i][k - 1];
      LL pow_f = c[size - i - 1][k - 1];
      LL pow_e = ((pow % val) - (pow_l + pow_f) % val + val) % val;
      unsigned LL mul = power(arr[i], pow_e) % val;
      temp = ((temp % val) * (mul % val)) % val;
   }
   return temp % val;
}
int main() {
   // sum of all the pairs
   pairs(100, 100);
   LL arr[] = { 3, 4, 1, 7 };
   int size = sizeof(arr) / sizeof arr[0];
   int k = 3;
   unsigned LL temp = product(arr, size, k);
   cout<<"product of all subsequences of size k except minimum and maximum element is :"<<temp << endl;
   return 0;
}

ผลลัพธ์

product of all subsequences of size k except minimum and maximum element is :144