#include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair #define vi vector #define ll long long #define SZ(x) ((int)(x.size())) #define IN(x,y) ((y).find((x)) != (y).end()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof (t.begin()) i = t.begin(); i != t.end(); i++) #define fi first #define se second ll gcdw (ll a, ll b, ll &l, ll &k) { if (!a) { l = 0; k = 1; return b; } ll d = gcdw(b%a, a, k, l); l -= (b/a) * k; return d; } bool congr (ll a, ll b, ll p, ll q, ll &c, ll &r) { ll x,y; r = gcdw(p,q,x,y); if ((a-b) % r) return 0; x = a + p*(b-a) / r*x; r = p*q / r; c = x % r; if (c < 0) c += r; return 1; } ll rozwiaz (vector uklad) { ll x = uklad[0].fi, mod = uklad[0].se; FORI(i,SZ(uklad)-1) { ll nowyx, nowymod; if (!congr(x,uklad[i].fi,mod,uklad[i].se,nowyx,nowymod)) return -1; x = nowyx; mod = nowymod; } return x; } int a[5006], p[5006], a1[5006], p1[5006]; // a1[3] - pozycja trojki int main () { while(1) { int n; scanf("%d",&n); if (!n) return 0; FORI(i,5*n) scanf("%d",a+i); FORI(i,5*n) a1[a[i]] = i; vi gr[1005]; int karta = 1; FORI(i,n) { gr[i].pb(karta++); gr[i].pb(karta++); } FORI(i,n) { gr[i].pb(karta++); gr[i].pb(karta++); } FORI(i,n) { gr[i].pb(karta++); } vi temp; /*FOR(u,5) for (int i = n; i >= 1; --i) { temp.pb(gr[i].back()); gr[i].pop_back(); }*/ FORI(i,n) FOR(u,5) temp.pb(gr[i][u]); FORI(i,5*n) { p[i] = temp[i-1]; //printf("%d ",p[i]); } FORI(i,5*n) p1[p[i]] = i; //printf("ddd "); //FORI(i,5*n) { printf("%d ",p[i]); } vector > wygrane; vi cykl[6]; int d[6]; FORI(i,5) { cykl[i].pb(a1[i]); while(1) { int nowy = p1[cykl[i].back()]; if (nowy == cykl[i][0]) break; cykl[i].pb(nowy); } d[i] = SZ(cykl[i]); // cykl[3] - kolejne pozycje trojki w ciagu } // printf("dbg: "); // FOR(u,SZ(cykl[1])) printf("%d ",cykl[1][u]); FORI(gracz,n) { int wanted[6], wantedpos[6][6]; wanted[1] = 2*gracz - 1; wanted[2] = 2*gracz; wanted[3] = 2*gracz - 1 + 2*n; wanted[4] = 2*gracz + 2*n; wanted[5] = 4*n + gracz; FORI(i,5) FORI(j,5) wantedpos[i][j] = -1; // wantedpos[i][j] = pozycja wanted[j] w cyklu i FORI(i,5) { FOR(u,SZ(cykl[i])) { FORI(j,5) if (cykl[i][u] == wanted[j]) wantedpos[i][j] = u; } } vi perm; FORI(i,5) perm.pb(i); do { // x = wantedpos[i][perm[i]] (mod d[i]) bool conti = 0; FORI(i,5) if (wantedpos[i][perm[i-1]] == -1) conti=1; if (conti) continue; vector uklad; FORI(i,5) uklad.pb(mp(wantedpos[i][perm[i-1]], d[i])); //ll res = rozwiaz(uklad); ll res = -1; if (res != -1) wygrane.pb(mp(res,gracz)); } while (next_permutation(perm.begin(),perm.end())); } if (wygrane.empty()) { printf("Neverending game.\n"); } else { pair para = *min_element(wygrane.begin(),wygrane.end()); printf("Player %d wins game number %lld.\n", para.se, para.fi+1); } } return 0; }