#include #include #define MAXN 20000 #define MAXC 100 int Card[MAXN]; int Where[MAXN]; int Perm[MAXN]; int PP[MAXC][MAXN]; int Length[MAXC]; int IsCompound[MAXN]; int Prime[MAXN]; int nPrimes; long long int PrevSet[MAXN]; long long int Set[MAXN]; long long int NewSet[MAXN]; long long int GCD(long long int a, long long int b) { 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; return; } } } 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() { for(int i = 2; i < 6000; i++) { if(IsCompound[i]) { continue; } for(int j = i * i; j < 6000; j += i) { IsCompound[j] = 1; } } nPrimes = 0; for(int i = 2; i < 6000; i++) { if(!(IsCompound[i])) { Prime[nPrimes++] = i; } } /*printf("n: %d\n", nPrimes); for(int i = 0; i < nPrimes; i++) { printf("%d\n", Prime[i]); }*/ 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 * 5) + 0] = i * 2; Perm[(i * 5) + 1] = (i * 2) + 1; Perm[(i * 5) + 2] = (i * 2) + (n * 2); Perm[(i * 5) + 3] = (i * 2) + (n * 2) + 1; Perm[(i * 5) + 4] = (n * 4) + i;*/ Perm[(i * 2) + 0] = (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 < 5; i++) { Length[i] = 0; PP[i][Length[i]++] = Where[i]; int cur = Perm[Where[i]]; while(cur != Where[i]) { PP[i][Length[i]++] = cur; cur = Perm[cur]; } } /*for(int i = 0; i < n * 5; i++) { printf("%d ", Perm[i]); } printf("\n");*/ /*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++) { int ok = 1; int nSet = 0; Set[nSet++] = 0; long long int mod = 1; for(int card = 0; card < 5; card++) { /*printf("nSet, mod: %d, %lld\n", nSet, mod); for(int i = 0; i < nSet; i++) { printf("%lld ", Set[i]); } printf("\n");*/ 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(((unsigned long long int) Set[i]) < min) { min = Set[i]; mini = player; //printf("PLayer %d can win after %llu rounds\n", mini + 1, min); } } } } 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; }