لینکهای مفید برای شرکت در مسابقه:
راهحلها و راهنماییهای نهایی اضافه شدند.
این راهنماییها را میتوانید در انتهای سوالات مشاهده کنید.
.
میتوانید سوالات خود را از قسمت "سوال بپرسید" مطرح کنید.
حسنی و نفر از دوستانش دور یک دایره نشستند و شروع به انجام بازی اتلمتل توله میکنند. شیوه انجام بازی این جوری هست که حسنی به عنوان نفر اول میگوید "سلام!". بعد از آن در هر مرحله نفر تا جلوتر نفر قبلی میگوید "سلام!". این روال ادامه دارد تا دوباره نوبت حسنی شود و آن موقع بازی تموم میشود.
حالا حسنی میخواهد بداند که این بازی چند مرحله طول میکشد و از آنجا که خیلی سرگرم بازی شده، از شما میخواهد تا جواب را به او بگویید.
در خط اول ورودی و آمده است.
در تنها خط خروجی تعداد مراحلی را که طول میکشد تا دوباره نوبت حسنی شود را چاپ کنید.
اگر افراد دور دایره را از تا شمارهگذاری کنیم به طوری که حسنی شماره یک را بگیرد طبق چنین روندی دوباره نوبت حسنی میشود:
در این حالت افرادی که سلام میکنند چنین شمارههایی را دارند:
در این حالت نفر تا بعدی حسنی خود حسنی است!
سعی کنید روند بازی را به صورت ساده، جوری که بتوانید کد آن را بزنید، در بیاورید.
برای مثال در سوال آمده است "تا زمانی که نوبت دوباره به حسنی نرسیدهاست، بازی ادامه دارد." که این همان حلقه است. (با این لینک میتوانید بیشتر با حلقه آشنا شوید.)
فرض کنید دو متغیر cnt و cur دارید که در هر مرحله cnt برابر تعداد مراحل تا الان است و cur برابر اینکه اخرین نفری که گفت "سلام" چه کسی است.
برای مثالها مراحل را اجرا کنید و مقدار cur و cnt را در هر مرحله یادداشت کنید.
فرض کنید که افراد را از ۰ تا شمارهگذاری کردیم و حسنی شماره ۰ است.
مثلا برای ورودی نمونه ۲ که و است به این شکل مقدارهای متغیر بعد از هر مرحله تغییر میکند.
cnt | cur |
---|---|
۱ | ۰ |
۲ | ۲ |
۳ | ۴ |
و بعد از مرحله ۳ دوباره حسنی را میبینیم و بازی تمام میشود.
قسمت اصلی الگوریتم، یعنی شبیهسازی کردن بازی، از یک حلقه تشکیل شده است و دو متغیر cnt و curکه حلقه تا زمانی که بازی تمام نشده است، اجرا میشود.
شبه کد الگوریتم:
منظور از دستور break
این است که از حلقه while
بیرون بیاید و منظور از while true
یعنی تا زمانی که به دستور break
نرسیده است، حلقه را تکرار کند و منظور از assign 0 to *cnt*
این است که مقدار متغیر cnt
را برابر صفر بکن.
میتوانید مشاهده کنید که بعد هر مرحله cnt یک واحد زیاد میشود و cur باید برابر k-امین نفر جلو باشد. در صورتی که افراد را به ترتیب از 0 تا شماره گذاری کنید و حسنی 0 باشد. بعد هر مرحله cur به علاوه k میشود و سپس به پیمانه n باقی مانده گرفته میشود.