#include #include #include int main(int argc, char ** argv) { int a, b, c, x, y, z, N, K; if (argc != 9) { printf("%s \n", argv[0]); return 1; } N = atoi(argv[7]); K = atoi(argv[8]); a = atoi(argv[1]) % N; x = atoi(argv[2]) % N; b = atoi(argv[3]) % N; y = atoi(argv[4]) % N; c = atoi(argv[5]) % N; z = atoi(argv[6]) % N; // Trojrozměrné pole, kam si budeme ukládat čísla iterací, // ve kterých jsme na tuto trojici narazili. int iter [N][N][N]; bzero(iter, N * N * N * sizeof(int)); // Po N^3 iteracích musíme najít stejnou trojici čísel. int seq [N * N * N]; seq[1] = x; seq[2] = y; seq[3] = z; int i = 3; while (iter[x][y][z] == 0) { iter[x][y][z] = i++; // Posuneme se o jedna doprava. int next = (a * x + b * y + c * z) % N; x = y; y = z; z = next; seq[i] = next; } // Teď už víme, jak dlouhá je perioda a předperioda. int q = iter[x][y][z]; int p = i - q; int kk = q + (K - q) % p; if (K < i) // Pro K < q jinak dává špatné výsledky – to je zadáním // zakázáno, ale určitě to budete chtít zkusit :) kk = K; printf("Cip s indexem %d ma cislo %d\n", kk, seq[kk]); return 0; }