Loading [MathJax]/jax/output/HTML-CSS/jax.js

المپدیا

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

ابزار کاربر

ابزار سایت


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

م.م.م

۶۰ گانگستر دور یک میز دایره‌ای نشسته‌اند و بازی متل متل موتوله را نجام می‌دهند. بازی «متل متل موتوله (یا مختصرا م.م.م) با شروع از x» به این صورت است که:

ابتدا گانگستر xام، سرش را روی میز می‌گذارد و می‌خوابد. سپس، xامین گانگستر بیدار بعد از x، می‌خوابد (او را x2 می‌نامیم). سپس x2 امین گانگستر بیدار بعد از x2 می‌خوابد و … . یعنی در مرحله‌ی i اگر گانگستر با شماره pi بخوابد، در مرحله بعد با شروع از اولین گانگستر بیدار بعد از pi، به اندازه‌ی pi نفر بیدار می‌شماریم و جلو می‌رویم. برنده‌ی این بازی، اگر اولین خوابنده k1 باشد، wk1‌ است.

برای مثال اگر x=1 باشد، ابتدا گانگستر شماره‌ ۱، بعد ۲، بعد ۴، بعد ۸ و … می‌خوابند.

مقدار T=w1×w2×w3××w59×w60 را در نظر بگیرید. باقی‌مانده تقسیم T بر Δ چند است؟

پاسخ

‎
 
#include <iostream>
using namespace std;
 
const int n = 60;
const int delta = 90907;
 
int findWinner(int start) {
  bool a[n+1];
  for (int i=1; i<=n; i++) a[i] = true;
 
  int x = start; a[x] = false;
  int alive = n-1;
  for (; alive != 1; ) {
    int jump = x;
    for (int i=1; i<=jump; i++)
      do {
        x++; if (x == n+1) x = 1;
      } while (!a[x]);
    a[x] = false; alive--;
  }
 
  for (int i=1; i<=n; i++)
    if (a[i])
      return i;
  return -1;
}
 
int main() {
  int t = 1;
  for (int start=1; start<=n; start++)
    t = (t*findWinner(start)) % delta;
  cout << (t) << endl;
 
  return 0;
}

ابزار صفحه