/* 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[1000000];
seed[0] = 0x9876_5432L;
seed[1] = 0xF1E2_D3C4L;
int[][] t = new int[8][16];
Map
<Long, Integer
> map
= new TreeMap
<Long, Integer
>(); map.put(seed[0], 0);
map.put(seed[1], 1);
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];
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
); }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQkgICAgbG9uZ1tdIHNlZWQgPSBuZXcgbG9uZ1sxMDAwMDAwXTsKICAgICAgICAgICAgc2VlZFswXSA9IDB4OTg3Nl81NDMyTDsKICAgICAgICAgICAgc2VlZFsxXSA9IDB4RjFFMl9EM0M0TDsKICAgICAgICAgICAgaW50W11bXSB0ID0gbmV3IGludFs4XVsxNl07CiAgICAgICAgICAgIE1hcDxMb25nLCBJbnRlZ2VyPiBtYXAgPSBuZXcgVHJlZU1hcDxMb25nLCBJbnRlZ2VyPigpOwogICAgICAgICAgICBtYXAucHV0KHNlZWRbMF0sIDApOwogICAgICAgICAgICBtYXAucHV0KHNlZWRbMV0sIDEpOwogICAgICAgICAgICBpbnQgbGFzdCA9IHNlZWQubGVuZ3RoLCBmaXJzdCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VlZFtpXSA9IHNlZWRbaSAtIDJdIF4gKHNlZWRbaSAtIDFdID4+ICgoaSAtIDEpICYgMHhGKSkgXiAoc2VlZFtpIC0gMV0gPDwgKChpICsgaSArIDEpICYgMHhGKSk7CiAgICAgICAgICAgICAgICBzZWVkW2ldICY9IDB4RkZGRl9GRkZGTDsKICAgICAgICAgICAgICAgIGxvbmcgZSA9IHNlZWRbaV07CiAgICAgICAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGUpKSB7CiAgICAgICAgICAgICAgICAJZmlyc3QgPSBtYXAuZ2V0KGUpOwogICAgICAgICAgICAgICAgCWxhc3QgPSBpOwogICAgICAgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiY3ljbGU6ICIgKyBtYXAuZ2V0KGUpICsgIiB0byAiICsgKGkgLSAxKSArICIgbGVuICIgKyAoaSAtIG1hcC5nZXQoZSkpKTsKICAgICAgICAgICAgICAgIAlicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcC5wdXQoZSwgaSk7CiAgICAgICAgICAgICAgICBpZiAoZSA9PSAwTCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlpFUk8hISAiICsgaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGFzdDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIAlsb25nIGUgPSBzZWVkW2ldOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJdFtqXVsoaW50KShlICYgMHhGTCldKys7CiAgICAgICAgICAgICAgICAJZSA+Pj0gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxlbmd0aDogIiArIHNlZWQubGVuZ3RoKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1bmlxdWU6ICIgKyBtYXAuc2l6ZSgpKTsKCQkJU3lzdGVtLm91dC5wcmludGYoImxhc3Q6ICU4eCVuIiwgc2VlZFtsYXN0IC0gMV0pOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAJaW50IG0gPSAwOwogICAgICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgaisrKQogICAgICAgICAgICAJewogICAgICAgICAgICAJCW0gPSBNYXRoLm1heChtLCB0W2ldW2pdKTsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgMTY7IGorKykKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50ZigiJTNkICIsIDEwMCAqIHRbaV1bal0gLyBtKTsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICB9Cgl9Cn0=