কিছু ক্রিয়াকলাপ সম্পাদন করে একটি প্রদত্ত অ্যারের সাবয়ারের প্রত্যাশিত যোগফল খুঁজে পাওয়ার জন্য প্রোগ্রাম
ধরুন আমাদের একটি অ্যারে A আছে যার আকার n এবং দুটি মান p এবং q। আমরা A.
তে এই অপারেশনগুলি সম্পাদন করতে পারি- এলোমেলোভাবে দুটি সূচী (l, r) নির্বাচন করুন যেখানে l
- এলোমেলোভাবে দুটি সূচক (l, r) নির্বাচন করুন যেখানে l
প্রথম অপারেশন p সংখ্যা বার এবং দ্বিতীয় অপারেশন q বার করার পরে, আমরা এলোমেলোভাবে দুটি সূচক l &r যেখানে l
সুতরাং, যদি ইনপুট A =[1,2,3] p =1 q =1 এর মত হয়, তাহলে আউটপুট হবে 4.667 কারণ
ধাপ 1:আমাদের তিনটি পছন্দ আছে −
-
swap(0, 1) তাই অ্যারে হবে 2 1 3
-
swap(0, 2) তাই অ্যারে হবে 3 2 1
-
swap(1, 2) তাই অ্যারে হবে 1 3 2
ধাপ 2:প্রতিটি ফলাফলের জন্য আমাদের কাছে আবার তিনটি পছন্দ আছে −
-
[2 1 3] থেকে [1 2 3], [3 1 2], [2 3 1]
-
[3 2 1] থেকে [2 3 1], [1 2 3], [3 1 2]
-
[1 3 2] থেকে [3 1 2], [2 3 1], [1 2 3]
9টি সম্ভাব্য অ্যারে আছে তাই সম্ভাব্যতা 1/9। সুতরাং 9টি অ্যারের প্রতিটিতে সমান সম্ভাবনা সহ 3টি সম্ভাব্য যোগফল থাকবে। উদাহরণস্বরূপ, [1 2 3], আমরা 1+2, 2+3 এবং 1+2+3 পেতে পারি। এবং এই ইনপুটের জন্য মোট 27টি ফলাফল রয়েছে, প্রত্যাশিত মানটি সমস্ত 27S এর যোগফল খুঁজে বের করে এবং 27 দ্বারা ভাগ করে গণনা করা যেতে পারে৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন matmul() সংজ্ঞায়িত করুন। এটি a, v, n লাগবে
- toret :=n আকারের একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
- আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
- 0 থেকে n - 1 রেঞ্জে j-এর জন্য
- করুন
- toret[i] :=toret[i] + a[i, j]*v[j]
- করুন
- রিটার্ন টরেট
- প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন:
- n :=A এর আকার
- temp :=একটি নতুন তালিকা
- swp :=(n - 3) /(n - 1)
- swapvalp :=((swp^p)*(n - 1) + 1) /n
- swapvalm :=(1 - (swp^p)) /n
- rev :=একটি নতুন খালি তালিকা
- dotv :=একটি নতুন খালি তালিকা
- আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
- swaprow :=একটি নতুন খালি তালিকা
- revrow :=একটি নতুন খালি তালিকা 0 থেকে n - 1 রেঞ্জে j-এর জন্য
- করুন
- swaprow এর শেষে swapvalm ঢোকান
- রিভরো শেষে 2*(সর্বনিম্ন i, j, (n-i-1) এবং (n-j-1+1)/(n*(n - 1)) সন্নিবেশ করুন
- swaprow :=একটি নতুন খালি তালিকা
- revrow :=একটি নতুন খালি তালিকা
- 0 থেকে n - 1 রেঞ্জের মধ্যে j এর জন্য, করুন
- swaprow[i] :=swapvalp
- রিভরো[i] :=1.0 - 2*(i + 1)*(n - i) - ন্যূনতম (i+1) এবং (n - i))/(n*(n-1))
- টেম্পের শেষে সোয়াপ্রো ঢোকান
- রিভের শেষে রিভরো ঢোকান
- ডটভির শেষে 2*(i+1)*(n-i) - 1)/(n*(n-1)) সন্নিবেশ করুন
- A :=matmul(temp, A, n)
- আমি 0 থেকে q রেঞ্জের জন্য, কর
- A :=matmul(rev, A, n)
- টোট :=0.0
- আমি 0 থেকে n রেঞ্জের জন্য, কর
- tot :=tot + dotv[i]*A[i]
- মোট প্রত্যাবর্তন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
def matmul(a, v, n): toret = [0]*n for i in range(n): for j in range(n): toret[i] += a[i][j]*v[j] return toret def solve(A, p, q): n = len(A) temp = [] swp = (n - 3)/(n - 1) swapvalp = (pow(swp, p)*(n - 1) + 1)/n swapvalm = (1 - pow(swp, p))/n rev = [] dotv = [] for i in range(n): swaprow = [] revrow = [] for j in range(n): swaprow.append(swapvalm) revrow.append(2*(min(i, j, n - i - 1, n - j - 1) + 1)/(n*(n - 1))) swaprow[i] = swapvalp revrow[i] = 1.0 - 2*((i + 1)*(n - i) - min(i + 1, n - i))/(n*(n - 1)) temp.append(swaprow) rev.append(revrow) dotv.append(2*((i + 1)*(n - i) - 1)/(n*(n - 1))) A = matmul(temp, A, n) for _ in range(q): A = matmul(rev, A, n) tot = 0.0 for i in range(n): tot += dotv[i]*A[i] return tot A = [1,2,3] p = 1 q = 1 print(solve(A, p, q))
ইনপুট
[1,2,3], 1, 1
আউটপুট
0.0