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

จำนวนวิธีคูณ n องค์ประกอบด้วยการดำเนินการแบบอссоциаทีฟ (Associative) ใน C++


ในโจทย์นี้ เราได้รับจำนวนเต็ม n ซึ่งเป็นจำนวนองค์ประกอบ งานของเราคือสร้างโปรแกรมนับจำนวนวิธีในการคูณ n องค์ประกอบด้วยการดำเนินการแบบ associative

การดำเนินการแบบ Associative (Associative operations) ให้ผลลัพธ์เดียวกันไม่ว่าจะจัดเรียงตัวเลขอย่างไร

ตัวอย่าง

อินพุต

3

เอาต์พุต

12

คำอธิบาย

(x*(y*z)), (x*(z*y)), (y*(x*z)), (y*(z*x)), (z*(x*y)), (z*(y*x)),
((x*y)*z), ((y*x)*z), ((x*z)*y), ((z*x)*y), ((z*y)*x), ((y*z)*x).

เพื่อแก้ปัญหานี้ เราจะพยายามหาว่ามีความสัมพันธ์หรืออนุกรมประเภทไหนที่สามารถสร้างได้ เพื่อให้เราสามารถทำให้ผลลัพธ์เป็นทั่วไปได้ ลองดูจำนวนการดำเนินการ associative ตามจำนวนตัวดำเนินการ:

1 => 1
2 => 2
3 => 12

ตอนนี้ ลองทำให้จำนวนเป็นทั่วไป สมมติ เราสร้างการดำเนินการ associative สำหรับ n องค์ประกอบ แล้วเราสามารถวางตัวดำเนินการคูณ n-1 ตัว และวงเล็บ n-1 คู่

ที่นี่ เราจะจัดเรียงพวกเขา 2 วิธี:

  • พิจารณาวิธีการคูณจนถึง (n-1) แล้วเราสามารถแทรกองค์ประกอบสุดท้ายไว้ที่ปลายใดก็ได้ของการเชื่อมโยง สำหรับ n-1 ตัวเลข จะได้ 2*2*(n-2) การเชื่อมโยงสำหรับ n ตัวดำเนินการ

  • จากนั้นพิจารณาการคูณของ (a1, a2, ... a(n-1)) และคูณ an ไปทางซ้ายหรือขวา ซึ่งให้วิธีเพิ่มเติม 2 วิธีในการสร้างการเชื่อมโยง

มาบวกและหาจำนวนการเชื่อมโยงทั้งหมดสำหรับ n ตัวดำเนินการโดยใช้กรณีข้างต้น:

ass(n) = ((2*2*(n-2))(ass(n-1))) + 2*(ass(n-1))
ass(n) = (4n-8)(ass(n-1)) + 2*(ass(n-1))
ass(n) = (4n-6)(ass(n-1))

ความสัมพันธ์นี้เหมือนกับ Pseudo Catalan Number ซึ่งมีสูตรและค่าเริ่มต้นเหมือนกัน

ดังนั้น เราสามารถใช้สูตรทั่วไปสำหรับ Pseudo Catalan Number ได้:

ass(n) = (2*n-2)! / (n-1)!

ลองดูการทำงานของสูตรสำหรับ n = 5:

ass(5) = (2*5 - 2)! / (5-1)!
ass(5) = 8! / 4! = 40320 / 24 = 1680

โปรแกรมหาจำนวนวิธีคูณ n องค์ประกอบด้วยการดำเนินการแบบ associative

// โปรแกรมหาจำนวนวิธีคูณ n องค์ประกอบด้วยการดำเนินการแบบ associative

ตัวอย่าง

#include <iostream>
using namespace std;

long int calcFactorial(int n) {
    if (n == 0 || n == 1)
        return 1;
    return n * calcFactorial(n - 1);
}

long int calcWays(int n) {
    int N = 2 * n - 2;
    int R = n - 1;
    return (calcFactorial((2 * n) - 2) / calcFactorial(n - 1));
}

int main() {
    int n = 7;
    cout << "The ways to multiply " << n << " elements with an associative operation: " << calcWays(n);
    return 0;
}

ผลลัพธ์

The ways to multiply 7 elements with an associative operation: 665280