#include #include #include #include #include #include #include #include using namespace std; #define FORC(it, V) for(__typeof((V).begin()) it = (V).begin(); it != (V).end(); ++it) const int zMAX = 1010; typedef long long llint; int phi[zMAX]; int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } llint multiMod(llint a, llint b, llint mod) // pretpostavka a, b < mod { if (b == 0) return 0; if (b == 1) return a; if (b&1) { llint ret = multiMod(a, b-1, mod) + a; if (ret >= mod) ret -= mod; return ret; } llint ret = multiMod(a, b>>1, mod); ret *= 2; if ( ret >= mod) ret -= mod; return ret; } llint powerMod(llint a, llint b, llint mod) // pretpostavka , a < mod { if (b == 0) return 1 % mod; if (b == 1) return a % mod; if (b&1) { return multiMod( powerMod(a, b-1, mod), a, mod ); } llint tmp = powerMod(a, b>>1, mod); return multiMod(tmp, tmp, mod); } void initCRM() { for (int i = 1; i < zMAX; ++i) { phi[i] = 0; for (int j = 1; j <= i; ++j) phi[i] += ( gcd(i,j) == 1 ); } } llint CRM(int m[], int M[], int n, int& ok) // ako ok == false, onda nema rjesenja { if( ok == false ) return -1; for (int i = 0; i < n; ++i) { m[i] %= M[i]; if (m[i] < 0) m[i] += M[i]; } ok = true; map > > mapa; for (int i = 0; i < n; ++i) { int x = M[i]; for (int d = 2; d*d <= x; ++d) { int pot = 1; while (x%d == 0) { x /= d; pot *= d; } if (pot > 1) { mapa[d].push_back(make_pair(pot, m[i]%pot)); // printf("d = %d (%d, %d)\n", d, pot, m[i]%pot); } } if (x > 1) { mapa[x].push_back(make_pair(x, m[i]%x)); // printf("d = %d (%d, %d)\n", x, x, m[i]%x); } } llint umn = 1; FORC(it, mapa) { vector< pair > &V = it->second; sort(V.begin(), V.end()); pair z = V.back(); FORC(it_v, V) { if (z.second % it_v->first != it_v->second) { ok = false; return -1; } } umn *= z.first; } // printf("umn = %lld\n", umn); llint ret = 0; FORC(it, mapa) { vector< pair > &V = it->second; pair z = V.back(); // printf("zadnji = (%d, %d)\n", z.first, z.second); // printf("%d * powerMod(%lld, %d)\n", z.second, umn/z.first, phi[z.first]); ret += ( z.second * powerMod(umn / z.first, phi[z.first], umn) ) % umn; if (ret >= umn) ret -= umn; } ret %= umn; if (ret == 0) return umn; return ret; } int p[5], bio[1005]; int cyc[1005], pos[1005], a[1005]; vector< int > v[10005]; int main(void) { initCRM(); // pozovi na pocetku programa jednom int n; while( scanf( "%d", &n ) == 1 ) { if( n == 0 ) break; for( int i = 0; i < 5*n; ++i ) { int x; scanf( "%d", &x ); --x; if( x >= 0 && x < 5 ) p[x] = i; bio[i] = 0; } int c = 0; for( int i = 0; i < n; ++i ) a[5*i + 0] = c++, a[5*i + 1] = c++; for( int i = 0; i < n; ++i ) a[5*i + 2] = c++, a[5*i + 3] = c++; for( int i = 0; i < n; ++i ) a[5*i + 4] = c++; int N = 5*n; c = 0; for( int i = 0; i < N; ++i ) if( !bio[i] ) { int x = i; do { v[c].push_back( x ); bio[x] = 1, x = a[x]; } while( !bio[x] ); reverse( v[c].begin(), v[c].end() ); for( int j = 0; j < v[c].size(); ++j ) cyc[ v[c][j] ] = c, pos[ v[c][j] ] = j; c++; } llint ans = -1; int tko; for( int i = 0; i < n; ++i ) { int x[5], m[5], M[5]; for( int j = 0; j < 5; ++j ) x[j] = 5*i + j; do { int ok = 1; for( int j = 0; j < 5; ++j ) { if( cyc[ p[j] ] != cyc[ x[j] ] ) ok = false; M[j] = v[ cyc[ p[j] ] ].size(); m[j] = pos[ x[j] ] - pos[ p[j] ]; } llint r = CRM( m, M, 5, ok ); if( ok ) if( ans == -1 || r < ans ) ans = r, tko = i; } while( next_permutation( x, x + 5 ) ); } for( int i = 0; i < c; ++i ) v[i].clear(); if( ans == -1 ) puts( "Neverending game." ); else printf( "Player %d wins game number %lld.\n", tko+1, ans ); } return 0; }