/* 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] = 0x9876_5432L;
seed[1] = 0xF1E2_D3C4L;
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
); }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQkgICAgbG9uZ1tdIHNlZWQgPSBuZXcgbG9uZ1syNTAwMDAwXTsKICAgICAgICAgICAgc2VlZFswXSA9IDB4OTg3Nl81NDMyTDsKICAgICAgICAgICAgc2VlZFsxXSA9IDB4RjFFMl9EM0M0TDsKICAgICAgICAgICAgaW50W11bXSB0ID0gbmV3IGludFs4XVsxNl07CiAgICAgICAgICAgIE1hcDxMb25nLCBJbnRlZ2VyPiBtYXAgPSBuZXcgVHJlZU1hcDxMb25nLCBJbnRlZ2VyPigpOwogICAgICAgICAgICBpbnQgbGFzdCA9IHNlZWQubGVuZ3RoLCBmaXJzdCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAJCiAgICAgICAgICAgICAgICBzZWVkW2ldID0gc2VlZFtpIC0gMl0gXiAoc2VlZFtpIC0gMV0gPj4gKChpIC0gMSkgJiAweEYpKSBeIChzZWVkW2kgLSAxXSA8PCAoKGkgKyBpICsgMSkgJiAweEYpKTsKICAgICAgICAgICAgICAgIHNlZWRbaV0gJj0gMHhGRkZGX0ZGRkZMOwogICAgICAgICAgICAgICAgbG9uZyBlID0gKHNlZWRbaSAtIDJdIDw8IDMyKSB8IHNlZWRbaSAtIDFdOwogICAgICAgICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShlKSkgewogICAgICAgICAgICAgICAgCWZpcnN0ID0gbWFwLmdldChlKTsKICAgICAgICAgICAgICAgIAlsYXN0ID0gaTsKICAgICAgICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oImN5Y2xlOiAiICsgbWFwLmdldChlKSArICIgdG8gIiArIChpIC0gMSkgKyAiIGxlbiAiICsgKGkgLSBtYXAuZ2V0KGUpKSk7CiAgICAgICAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYXAucHV0KGUsIGkpOwogICAgICAgICAgICAgICAgaWYgKGUgPT0gMEwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJaRVJPISEgIiArIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxhc3Q7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAJbG9uZyBlID0gc2VlZFtpXTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCXRbal1bKGludCkoZSAmIDB4RkwpXSsrOwogICAgICAgICAgICAgICAgCWUgPj49IDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsZW5ndGg6ICIgKyBzZWVkLmxlbmd0aCk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidW5pcXVlOiAiICsgbWFwLnNpemUoKSk7CgkJCVN5c3RlbS5vdXQucHJpbnRmKCJsYXN0OiAlOHglbiIsIHNlZWRbbGFzdCAtIDFdKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgCWludCBtID0gMDsKICAgICAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgMTY7IGorKykKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCQltID0gTWF0aC5tYXgobSwgdFtpXVtqXSk7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IDE2OyBqKyspCiAgICAgICAgICAgIAl7CiAgICAgICAgICAgIAkJU3lzdGVtLm91dC5wcmludGYoIiUzZCAiLCAxMDAgKiB0W2ldW2pdIC8gbSk7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgfQoJfQp9