#include #include #define MAXN 20000 #define MAXC 100 int Card[MAXN]; int Where[MAXN]; int Perm[MAXN]; int PP[MAXC][MAXN]; int Length[MAXC]; long long int PrevSet[MAXN]; long long int Set[MAXN]; long long int NewSet[MAXN]; int Winnable[MAXN]; int Got[MAXN][MAXC]; long long int GCD(long long int a, long long int b) { long long int q; if(a < b) { q = a; a = b; b = q; } while(b) { q = a % b; a = b; b = q; } return a; } long long int abs(long long int a) { return (a < 0) ? (-a) : a; } void Solve(long long int a, long long int m1, long long int b, long long int m2, long long int gcd, long long int* Set, int& nSet) { if(abs(a - b) % gcd) { return; } long long int m = (m1 / gcd) * m2; for(long long int i = a; i < m; i += m1) { if(i % m2 == b) { Set[nSet++] = i; break; } } } void Enlarge(long long int* Set, int& nSet, long long int& mod1, long long int* NewSet, int nNewSet, long long int mod2) { for(int i = 0; i < nSet; i++) { PrevSet[i] = Set[i]; } int nPrevSet = nSet; nSet = 0; long long int gcd = GCD(mod1, mod2); for(int i = 0; i < nPrevSet; i++) { for(int j = 0; j < nNewSet; j++) { Solve(PrevSet[i], mod1, NewSet[j], mod2, gcd, Set, nSet); } } mod1 = (mod1 / gcd) * mod2; } int main() { while(1) { int n; scanf("%d", &n); if(!(n)) { break; } for(int i = 0; i < n * 5; i++) { scanf("%d", Card + i); Card[i]--; Where[Card[i]] = i; } for(int i = 0; i < n; i++) { Perm[i * 2] = (i * 5) + 0; Perm[(i * 2) + 1] = (i * 5) + 1; Perm[(i * 2) + (n * 2)] = (i * 5) + 2; Perm[(i * 2) + (n * 2) + 1] = (i * 5) + 3; Perm[(n * 4) + i] = (i * 5) + 4; } for(int i = 0; i < n; i++) { for(int j = 0; j < 5; j++) { Got[i][j] = 0; } Winnable[i] = 1; } for(int i = 0; i < 5; i++) { Length[i] = 0; PP[i][Length[i]++] = Where[i]; Got[Where[i] / 5][i] = 1; int cur = Perm[Where[i]]; while(cur != Where[i]) { Got[cur / 5][i] = 1; PP[i][Length[i]++] = cur; cur = Perm[cur]; } } for(int i = 0; i < n; i++) { for(int j = 0; j < 5; j++) { if(!(Got[i][j])) { Winnable[i] = 0; break; } } } /*for(int i = 0; i < n * 5; i++) { printf("Length of %d is %d\n", i + 1, Length[i]); } printf("\n"); for(int i = 0; i < n * 5; i++) { printf("%d ", Card[i]); } printf("\n"); for(int i = 0; i < n * 5; i++) { printf("%d ", Card[Perm[i]]); } printf("\n"); for(int i = 0; i < n * 5; i++) { printf("%d ", Card[Perm[Perm[i]]]); } printf("\n"); for(int i = 0; i < n * 5; i++) { printf("%d ", Card[Perm[Perm[Perm[i]]]]); } printf("\n");*/ unsigned long long int min = 1LLU << 63; int mini = -1; for(int player = 0; player < n; player++) { if(!(Winnable[player])) { continue; } int ok = 1; int nSet = 0; Set[nSet++] = 0; long long int mod = 1; for(int card = 0; card < 5; card++) { int nNewSet = 0; for(int i = 0; i < Length[card]; i++) { if(PP[card][i] / 5 == player) { NewSet[nNewSet++] = i; } } if(!(nNewSet)) { ok = 0; break; } else { Enlarge(Set, nSet, mod, NewSet, nNewSet, Length[card]); if(!(nSet)) { ok = 0; break; } } } if(ok) { for(int i = 0; i < nSet; i++) { if(Set[i] != 0) { if(((unsigned long long int) Set[i]) < min) { min = Set[i]; mini = player; } } } } } if(mini == -1) { printf("Neverending game.\n"); } else { printf("Player %d wins game number %llu.\n", mini + 1, min); } /*for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { printf("gcd(%d, %d) = %lld\n", i, j, GCD(i, j)); } }*/ } return 0; }