/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// your code goes here
long[] seed = new long[2500000];
seed[0] = 1;
seed[1] = 0;
int[][] t = new int[8][16];
Map
<Long, Integer
> map
= new TreeMap
<Long, Integer
>(); int last = seed.length, first = 0;
for (int i = 2; i < seed.length; i++)
{
seed[i] = seed[i - 2] ^ (seed[i - 1] >> ((i - 1) & 0xF)) ^ (seed[i - 1] << ((i + i + 1) & 0xF));
seed[i] &= 0xFFFF_FFFFL;
long e = (seed[i - 2] << 32) | seed[i - 1];
if (map.containsKey(e)) {
first = map.get(e);
last = i;
System.
out.
println("cycle: " + map.
get(e
) + " to " + (i
- 1) + " len " + (i
- map.
get(e
))); break;
}
map.put(e, i);
}
for (int i = first; i < last; i++)
{
long e = seed[i];
for (int j = 0; j < 8; j++)
{
t[j][(int)(e & 0xFL)]++;
e >>= 4;
}
}
System.
out.
println("length: " + seed.
length); System.
out.
println("unique: " + map.
size()); System.
out.
printf("last: %8x%n", seed
[last
- 1]); for (int i = 0; i < 8; i++)
{
int m = 0;
for (int j = 0; j < 16; j++)
{
m
= Math.
max(m, t
[i
][j
]); }
for (int j = 0; j < 16; j++)
{
System.
out.
printf("%3d ",
100 * t
[i
][j
] / m
); }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQkgICAgbG9uZ1tdIHNlZWQgPSBuZXcgbG9uZ1syNTAwMDAwXTsKICAgICAgICAgICAgc2VlZFswXSA9IDE7CiAgICAgICAgICAgIHNlZWRbMV0gPSAwOwogICAgICAgICAgICBpbnRbXVtdIHQgPSBuZXcgaW50WzhdWzE2XTsKICAgICAgICAgICAgTWFwPExvbmcsIEludGVnZXI+IG1hcCA9IG5ldyBUcmVlTWFwPExvbmcsIEludGVnZXI+KCk7CiAgICAgICAgICAgIGludCBsYXN0ID0gc2VlZC5sZW5ndGgsIGZpcnN0ID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBzZWVkLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIAkKICAgICAgICAgICAgICAgIHNlZWRbaV0gPSBzZWVkW2kgLSAyXSBeIChzZWVkW2kgLSAxXSA+PiAoKGkgLSAxKSAmIDB4RikpIF4gKHNlZWRbaSAtIDFdIDw8ICgoaSArIGkgKyAxKSAmIDB4RikpOwogICAgICAgICAgICAgICAgc2VlZFtpXSAmPSAweEZGRkZfRkZGRkw7CiAgICAgICAgICAgICAgICBsb25nIGUgPSAoc2VlZFtpIC0gMl0gPDwgMzIpIHwgc2VlZFtpIC0gMV07CiAgICAgICAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGUpKSB7CiAgICAgICAgICAgICAgICAJZmlyc3QgPSBtYXAuZ2V0KGUpOwogICAgICAgICAgICAgICAgCWxhc3QgPSBpOwogICAgICAgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiY3ljbGU6ICIgKyBtYXAuZ2V0KGUpICsgIiB0byAiICsgKGkgLSAxKSArICIgbGVuICIgKyAoaSAtIG1hcC5nZXQoZSkpKTsKICAgICAgICAgICAgICAgIAlicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcC5wdXQoZSwgaSk7CiAgICAgICAgICAgICAgICBpZiAoZSA9PSAwTCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlpFUk8hISAiICsgaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGFzdDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIAlsb25nIGUgPSBzZWVkW2ldOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJdFtqXVsoaW50KShlICYgMHhGTCldKys7CiAgICAgICAgICAgICAgICAJZSA+Pj0gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxlbmd0aDogIiArIHNlZWQubGVuZ3RoKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1bmlxdWU6ICIgKyBtYXAuc2l6ZSgpKTsKCQkJU3lzdGVtLm91dC5wcmludGYoImxhc3Q6ICU4eCVuIiwgc2VlZFtsYXN0IC0gMV0pOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAJaW50IG0gPSAwOwogICAgICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgaisrKQogICAgICAgICAgICAJewogICAgICAgICAgICAJCW0gPSBNYXRoLm1heChtLCB0W2ldW2pdKTsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgMTY7IGorKykKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50ZigiJTNkICIsIDEwMCAqIHRbaV1bal0gLyBtKTsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICB9Cgl9Cn0=