سلام دوست عزیز😃👋

به مسابقه «کدکاپ ۸ - دست‌گرمی» خوش آمدی!

لینک‌های مفید برای شرکت در مسابقه:

این مسابقه هیچ تاثیری در رقابت‌های کدکاپ ندارد و صرفاً برای دست‌گرمی شما است.

موفق باشید و بهتون خوش بگذره 😉✌

فیبوجمع


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

یک آرایه از اعداد صحیح مثل a1,a2,,ana_1, a_2, \dots, a_n\, داریم. در qq مرحله یک عملیات مثل زیر روی آن انجام می‌دهیم.

دو عدد صحیح مثل \ell و rr انتخاب می‌کنیم که 1rn1 \leq \ell \leq r \leq n باشد و سپس مقدار

  • a=a+fib1a_{\ell} = a_{\ell} + fib_1
  • a+1=a+1+fib2a_{\ell + 1} = a_{\ell + 1} + fib_2
  • \dots
  • ar=ar+fibr+1a_r = a_r + fib_{r-\ell + 1}

می‌شود که منظور از fibifib_i جمله‌ی iiام دنباله فیبوناچی است. دنباله فیبوناچی به صورت زیر تعریف می‌شود:

fibn={1n=11n=2fibn1+fibn2n>2 fib_n = \begin{cases} 1 & n = 1 \\ 1 & n = 2 \\ fib_{n - 1} + fib_{n - 2} & n > 2 \end{cases}

از شما می‌خواهیم بعد از پایان این عملیات‌ها، مقدار نهایی اعضای آرایه را چاپ کنید. چون این مقدار می‌تواند خیلی بزرگ باشد. صرفاً باقی‌مانده هر عدد آرایه را بر 109+710^9 + 7 چاپ کنید.

ورودی🔗

در سطر اول ورودی، دو عدد صحیح و مثبت nn و qq که با یک فاصله از هم جدا شده‌اند، داده می‌شود. 1n,q1000001 \leq n, q \leq 100 \, 000

در سطر دوم ورودی، nn عدد صحیح a1,a2,,ana_1, a_2, \dots, a_n\, که با یک فاصله از هم جدا شده‌اند داده می‌شود. 1ai1091 \leq a_i \leq 10^9

در qq سطر بعدی، در هر سطر دو عدد صحیح \ell و rr داده می‌شود که نشان‌دهنده‌ی بازه‌ی عملیات است. 1rn1 \leq \ell \leq r \leq n

خروجی🔗

در تنها سطر خروجی، nn عدد صحیح که با یک فاصله از هم جدا شده‌اند را چاپ کنید که وضعیت نهایی آرایه‌ی aa را نشان می‌دهد.

چون ممکن است مقدار اعداد آرایه خیلی بزرگ شود، باقی‌مانده‌ی این اعداد را بر 109+710^9 + 7 چاپ کنید.

مثال‌ها🔗

ورودی نمونه ۱🔗

5 3
1 2 3 4 5
2 4
1 3
5 5
Plain text

خروجی نمونه ۱🔗

2 4 6 6 6
Plain text

ورودی نمونه ۲🔗

3 2
2 4 1
1 3
2 3
Plain text

خروجی نمونه ۲🔗

3 6 4
Plain text
راهنمایی اول

نیازی نیست همه‌ی تغییرات را در لحظه روی آرایه اعمال کنیم. می‌توانیم همه را دریافت کنیم و با ترتیبی مناسب آن‌ها را روی آرایه اعمال کنیم.

راهنمایی دوم

اگر لحظه‌ی شروع و پایان هر بازه که باید تغییر کند را روی آرایه در نظر بگیریم و به ترتیب از چپ آرایه (اندیس ۰) شروع کنیم و به سمت راست (اندیس n1n - 1) حرکت کنیم و همه‌ی تغییرات را به همین ترتیب روی آرایه اعمال کنیم. به این ایده sweep line می‌گویند.

راهنمایی سوم

با توجه به رابطه بازگشتی فیبوناچی که برای همه یکی هست می‌توان اتفاق این تغییرات را جمع کرد. یعنی اگر چند تغییر روی یک خانه اتفاق می‌افتد می‌توان همه‌ی آن‌ها را باهم جمع کرد.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.