কম্পিউটার টিউটোরিয়াল

সি++-এ স্টুডেন্ট অ্যাটেন্ডেন্স রেকর্ড II


মান লিইয়ে নিই একটি পজিটিভ ইন্টিজার n রয়েছে, আমাদের দৈর্ঘ্য n-এর সব সম্ভাব্য অ্যাটেন্ডেন্স রেকর্ডের সংখ্যা বের করতে হবে, যেগুলো রিওয়ার্ডেবল হিসেবে বিবেচিত হবে। যেহেতু উত্তর খুব বড় হতে পারে, আমরা 10^9 + 7 দিয়ে মডুলো করে ফেরত দিব।

স্টুডেন্ট অ্যাটেন্ডেন্স রেকর্ডে স্ট্রিং শুধু নিম্নলিখিত তিনটি ক্যারেক্টার ধারণ করতে পারে:

  • 'A' মানে অনুপস্থিত।
  • 'L' মানে দেরি।
  • 'P' মানে উপস্থিত।

একটি অ্যাটেন্ডেন্সকে রিওয়ার্ডেবল বলা হয় যদি এতে একটির অধিক 'A' (অনুপস্থিত) বা দুটির অধিক স prêt 'L' (দেরি) না থাকে। সুতরাং আমাদের সর্বোচ্চ পয়েন্ট বের করতে হবে।

যদি ইনপুট 2 হয়, তবে আউটপুট হবে ৮, কারণ আমরা ৮টি সম্ভাব্য রিওয়ার্ডেবল উপায় জেনারেট করতে পারি, এগুলো হল [PP, AP, PA, LP, PL, AL, LA, LL], শুধু AA থাকবে না।

समाधान पद्धति

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:

  • add() ফাংশন সংজ্ঞায়িত করুন, যা a, b গ্রহণ করবে,
    • ফেরত দিন ((a mod m) + (b mod m)) mod m
  • মূল পদ্ধতিতে নিম্নলিখিত কাজ করুন:
    • আকার n + 1-এর p, a, l, ap, al সরণি সংজ্ঞায়িত করুন
    • যদি n, 1-এর সমান হয়, তবে:
      • 3 ফেরত দিন
    • p[0] := 1, p[1] := 1, p[2] := 3
    • a[0] := 1, a[1] := 1, a[2] := 2
    • l[0] := 1, l[1] := 1, l[2] := 3
    • ap[0] := 1, ap[1] := 1, ap[2] := 2
    • al[0] := 1, al[1] := 1, al[2] := 2
    • i := 3 থেকে आरंभ করুন, जब i <= n, আপডেট করুন (i 1 বাড়ান), করুন:
      • p[i] := add(add(p[i - 1], a[i - 1]), l[i - 1])
      • l[i] := add(add(p[i - 1], p[i - 2]), add(a[i - 1], a[i - 2]))
      • a[i] := add(al[i - 1], ap[i - 1])
      • al[i] := add(ap[i - 1], ap[i - 2])
      • ap[i] := add(ap[i - 1], al[i - 1])
    • ফেরত দিন add(add(p[n], l[n]), a[n])

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli m = 1e9 + 7; class Solution { public:    lli add(lli a, lli b){       return ( (a % m) + (b % m) ) % m;    }    int checkRecord(int n) {       vector <int> p(n+1), a(n+1), l(n+1), ap(n+1), al(n+1);       if(n == 1)return 3;       p[0] = 1;       p[1] = 1;       p[2] = 3;       a[0] = 1;       a[1] = 1;       a[2] = 2;       l[0] = 1;       l[1] = 1;       l[2] = 3;       ap[0] = 1;       ap[1] = 1;       ap[2] = 2;       al[0] = 1;       al[1] = 1;       al[2] = 2;       for(int i = 3; i <= n; i++){          p[i] = add(add(p[i-1], a[i-1]), l[i-1]);          l[i] = add(add(p[i-1], p[i-2]),add(a[i-1] , a[i-2]));          a[i] = add(al[i-1], ap[i-1]);          al[i] = add(ap[i-1], ap[i-2]);          ap[i] = add(ap[i-1], al[i-1]);       }       return add(add(p[n], l[n]), a[n]);    } }; main(){    Solution ob;    cout << (ob.checkRecord(3)); }

इनपुट

3

आउटपुट

19

  1. C++-এ ক্লাস এবং অবজেক্ট

  2. স্ট্রাকচারে ছাত্রের তথ্য সংরক্ষণ করার C++ প্রোগ্রাম

  3. C++-এ আইডেন্টিফায়ার (Identifiers)

  4. লিনাক্সে C++-এর জন্য সেরা IDE কী?