#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int i=(a); i<(b); ++i) #define REP(i,n) for(int i=1; i<=(n); ++i) #define pb push_back #define INF 9223372036854775807ll #define EPS 10e-9 #define P 1000000007 typedef vector vi; typedef pair pii; #define st first #define nd second typedef long long ll; typedef unsigned long long ull; #define ISDEBUG 0 #define dprintf if(ISDEBUG) printf void PTAB(const vi& t) {FOR(i,0,t.size()) printf("%d ", t[i]); puts("");} #define DPTAB if(ISDEBUG) PTAB int n; int in[5010]; int inn[5010]; int next[5010]; int prev[5010]; int ciagi[5][5010]; ll q[5], r[5]; ll m[5]; int kolejki; void RozdzielKarty(); void UtworzCiagi(); ll Rozkmin(int gracz); bool Solve(const ll q[5], const ll r[5], ll m[5], int zero); int main() { do { scanf("%d", &n); if (n == 0) break; FOR(i, 0, 5*n) scanf("%d", &in[i]); RozdzielKarty(); FOR(i, 0, 5*n) inn[i] = in[next[i]]; UtworzCiagi(); ll min = INF; int gracz = -1; FOR(i, 0, n) { ll res= Rozkmin(i); dprintf("------- %lld\n", res); if (res < min) { min = res; gracz = i; } } if (gracz >= 0) printf("Player %d wins game number %lld.\n", gracz+1, min+1); else printf("Neverending game.\n"); } while (1); return 0; } // -------------------------------------------------------- void RozdzielKarty() { int talia = 0; FOR(i, 0, n) { next[5*i] = talia++; next[5*i+1] = talia++; } FOR(i, 0, n) { next[5*i+2] = talia++; next[5*i+3] = talia++; } FOR(i, 0, n) { next[5*i+4] = talia++; } FOR(i, 0, 5*n) prev[next[i]] = i; } // --------------------------------------------------------- void UtworzCiagi() { FOR(i, 0, 5*n) { if (inn[i] <= 5) ciagi[inn[i]-1][0] = i; } FOR(i, 0, 5) { int j = 1; do { ciagi[i][j] = prev[ciagi[i][j-1]]; ++j; } while (ciagi[i][j-1] != ciagi[i][0]); q[i] = j-1; } } ll Rozkmin(int gracz) { ll min = INF; int perm[5]; FOR(i, 0, 5) perm[i] = 5*gracz + i; FOR(i, 0, 120) { r[0] = r[1] = r[2] = r[3] = r[4] = 0; bool flag = false; FOR(j, 0, 5) { while(ciagi[j][r[j]] != perm[j]) { ++r[j]; if (r[j] >= q[j]) { flag = true; break; } } if (flag) break; } /*FOR(i, 0, 5) printf("%lld ", r[i]); puts(" - ");*/ if (flag) { next_permutation(perm, perm+5); continue; } ll m[5]; ll res; if(!Solve(q, r, m, 0)) res = INF; else { res = m[0]*q[0] + r[0]; if (res < min) min = res; } dprintf("-- %lld\n", res); next_permutation(perm, perm+5); } return min; } // ---------------------------------------------------------------- ll NWD(ll a, ll b) { if (b) return NWD(b, a%b); else return a; } ll powmod(ll podst, ll wykl, ll mod) { if (wykl == 0) return 1; if (wykl == 1) return podst % mod; if (wykl % 2 == 0) return powmod((podst*podst) % mod, wykl/2, mod); else return (podst*powmod((podst*podst) % mod, wykl/2, mod)) % mod; } bool ss(ll qi, ll ri, ll q0, ll& result) { ri %= q0; ri = (q0-ri)%q0; ll d = NWD(qi, q0); if(ri % d != 0) return false; qi /= d; q0 /= d; ri /= d; ll odwr = powmod(qi, q0-2, q0); result = (ri*odwr)%q0; return true; } bool Solve(const ll q[5], const ll r[5], ll mm[5], int zero) { ll qq[5]; ll rr[5]; ll kk[5]; ll qp[5]; ll res[5]; FOR(i, zero, 5) { qq[i] = q[i]; rr[i] = r[i]; } FOR(i, zero + 1, 5) { rr[i] -= rr[zero]; int a,b; if(rr[i]>=0) a=0; else a = (qq[i]-rr[i]-1)/qq[i]; b = a + qq[zero]; //for(mm[i]=a; mm[i]