Processing math: 0%

المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:مرحله ی دوم:دوره ی ۲۲:سوال ۱

ماشین عجیب

سعید دارای ماشین عجیبی است که دارای ‎۱۰۰۰‎ خانه حافظه می‌باشد. به هر خانه حافظه یک ‎بیت‎ گفته می‌شود و بیت ‎iام را با ‎M[i]‎ نشان می‌دهیم. هر بیت حافظه یکی از دو مقدار ۰ و ۱ را در خود ذخیره می‌کند.

متاسفانه مقادیر ذخیره شده در حافظه ماشین قابل رویت نیست. تنها می‌دانیم اعداد ذخیره شده در بیت‌های ‎۸۰۱‎ تا ۹۰۰ برابر ‎۰‎ و اعداد ذخیره شده در بیت‌های ‎۹۰۱‎ تا ۱۰۰۰‎ برابر ‎۱ هستند.

این ماشین عجیب تنها توانایی اجرای دستورات زیر را دارد:

  • M[i]= M[i_1 ]∧ M[i_2 ]⋯∧ M[i_k]‎ : با اجرای این دستور در صورتی که اعداد ذخیره شده در بیت‌های ‎i_1‎ام، ‎i_2‎ام و ‎⋯‎ و ‎i_k‎ام برابر ‎۱‎ باشند مقدار ‎M[i]‎ یک و در غیر این صورت صفر خواهد شد.
  • M[i]= M[i_1 ]∨ M[i_2 ]⋯∨ M[i_k]‎ : با اجرای این دستور در صورتی که اعداد ذخیره شده در بیت‌های ‎i_1‎ام، ‎i_2‎ام و ‎⋯‎ و ‎i_k‎ام برابر ‎۰‎ باشند مقدار ‎M[i]‎ صفر و در غیر این صورت یک خواهد شد.
  • M[i]= M[i_1 ]⊕ M[i_2 ]⋯⊕ M[i_k]: با اجرای این دستور در صورتی که تعداد یک‌های ذخیره شده در بیت‌های ‎i_1‎ام، ‎i_2‎ام و ‎⋯‎ و ‎i_k‎ام فرد باشد مقدار‎M[i]‎ یک و در غیر این صورت صفر خواهد شد.

در واقع این سه دستور به ترتیب ‎or٬and‎‎ و ‎xor‎ منطقی می‌باشند. بدیهی است که بلافاصله بعد از این که سعید به دستگاه دستور می‌دهد، دستگاه دستور را اجرا می‌کند. توجه کنید اندیس‌های ‎i‎,‎i_1,⋯‎,‎i_k‎ حداقل ۱ و حداکثر ۱۰۰۰ می‌باشند و k نیز حداقل ۱ و حداکثر ۱۰۰۰ می‌باشد.

در کنار دستورات فوق، این ماشین عجیب به سوال زیر هم پاسخ می‌دهد.

  • آیا هنوز اعداد ذخیره شده در بیت‌های ‎۸۰۱‎ام تا ۹۰۰ام برابر با ۰ و اعداد ذخیره شده در بیت‌های ‎۹۰۱‎ام تا ۱۰۰۰‎ام برابر با ‎۱ است؟

جواب ماشین به این سوال بله یا خیر خواهد بود.

سعید می ‌خواهد در مورد عدد ‎x = ۸ \times M[۱]‎ + ‎۴ \times M[۲]‎ + ۲ \times M[۳]‎ + ‎M[۴]‎ اطلاعاتی کسب کند. او دوست دارد این اطلاعات را با اجرای کمترین تعداد دستور و تنها یک بار سوال پرسیدن کسب کند. به او کمک کنید تا اطلاعات زیر را بدست اورد.

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

الف) آیا ‎x بزرگتر از ‎۵‎ است؟

ب) آیا x‎ توانی از ‎۲‎ است؟ (دقت کنید که ‎۱‎ توانی از ۲‎ است).

پ) آیا x‎ بر ۳‎ بخش‌پذیر است؟

پاسخ

دقت کنید x یک عدد بین 1 تا 15 است.
الف)
به ازای همه‌ی xهای بزرگتر 5 عبارت M[1] ∨ ( M[2] ∧ M[3] ) برابر با یک و به ازای همه‌ی xهای کوچکتر مساوی با 5 این عبارت برابر با صفر است. پس دستور‌ها را به این صورت می‌نویسیم:

  • M[10] = M[2] ∧ M[3]
  • M[801] = M[1] ∨ M[10]

حال با پرسیدن سوال از ماشین اگر با جواب خیر مواجه شدیم x بزرگتر از 5 و در غیر این صورت x کوچکتر مساوی با 5 است.

ب)
توان دو بودن x معادل با وجود دقیقاً یک بیت 1 بین M[1]، M[2]، M[3] و M[4] است. پس باید xor این 4 بیت یک بوده و نیز اگر جفت‌های M[1] و M[2] یا M[3] و M[4] را در نظر بگیریم هیچ کدام از جفت‌ها نباید کاملاً یک باشند.
پس برای توان دو بودن x عبارت ( M[1] ⊕ M[2] ⊕ M[3] ⊕ M[4] ) ! ( ( M[1] ∧ M[2] ) ∨ ( M[3] ∧ M[4] ) ) باید برابر با یک باشد و نیز اگر این عبارت صفر باشد آنگاه x توان دو نیست.
دقت کنید که !X همان not است که یک را به صفر و صفر را به یک تبدیل می‌کنید. یعنی همان X ⊕ 1.

پس دستور‌ها را به این شکل می‌نویسیم:

  • M[10] = M[1] ⊕ M[2] ⊕ M[3] ⊕ M[4]
  • M[11] = M[1] ∧ M[2]
  • M[12] = M[3] ∧ M[4]
  • M[12] = M[11] ∨ M[12]
  • M[12] = M[12] ⊕ M[1000]
  • M[901] = M[12] ∧ M[10]

حال از ماشین سوال می‌پرسیم. اگر جواب ماشین بله بود x توان دو است وگرنه x توان دو نیست.

پ)
هر x را به صورت یک رشته دودویی 4 رقمی در نظر می‌گیریم. یعنی x برابر است با:
\overline{ M[1]M[2]M[3]M[4] }
با توجه به این نمایش دودویی، همه‌ی xهای مضرب 3 به صورت زیر هستند:
0000, 0011, 0110, 1001, 1100, 1111
با کمی مشاهده متوجه می‌شویم که تعداد بیت‌های یک این اعداد زوج بوده و نیز فقط 1010 و 0101 هستند که تعداد بیت‌های یک آنها زوج است ولی مضرب 3 نیستند. حال عبارت زیر را در نظر بگیرید:
M[1] ⊕ M[2] ⊕ M[3] ⊕ M[4] ( (M[1]⊕M[2]) ∧ (M[2]⊕M[3]) ∧ (M[3]⊕M[4]) )
این عبارت برای مضارب 3 برابر با صفر و برای اعداد غیر بخش‌ پذیر بر 3 برابر با یک است. پس دستور‌های مورد نیاز برابرند با:

  • M[10] = M[1]⊕M[2]
  • M[11] = M[2]⊕M[3]
  • M[12] = M[3]⊕M[4]
  • M[13] = M[10] ∧ M[11] ∧ M[12]
  • M[801] = M[1] ⊕ M[2] ⊕ M[3] ⊕ M[4] ⊕ M[13]

جواب قسمت پ برابر است با جواب سوال ما از ماشین.


ابزار صفحه