۶۰ گانگستر دور یک میز دایرهای نشستهاند و بازی متل متل موتوله را نجام میدهند. بازی «متل متل موتوله (یا مختصرا م.م.م) با شروع از 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; }