/* 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] = 1;
seed[1] = 3;
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
); }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQkgICAgbG9uZ1tdIHNlZWQgPSBuZXcgbG9uZ1sxMDAwMDAwXTsKICAgICAgICAgICAgc2VlZFswXSA9IDE7CiAgICAgICAgICAgIHNlZWRbMV0gPSAzOwogICAgICAgICAgICBpbnRbXVtdIHQgPSBuZXcgaW50WzhdWzE2XTsKICAgICAgICAgICAgTWFwPExvbmcsIEludGVnZXI+IG1hcCA9IG5ldyBUcmVlTWFwPExvbmcsIEludGVnZXI+KCk7CiAgICAgICAgICAgIG1hcC5wdXQoc2VlZFswXSwgMCk7CiAgICAgICAgICAgIG1hcC5wdXQoc2VlZFsxXSwgMSk7CiAgICAgICAgICAgIGludCBsYXN0ID0gc2VlZC5sZW5ndGgsIGZpcnN0ID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBzZWVkLmxlbmd0aDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZWVkW2ldID0gc2VlZFtpIC0gMl0gXiAoc2VlZFtpIC0gMV0gPj4gKChpIC0gMSkgJiAweEYpKSBeIChzZWVkW2kgLSAxXSA8PCAoKGkgKyBpICsgMSkgJiAweEYpKTsKICAgICAgICAgICAgICAgIHNlZWRbaV0gJj0gMHhGRkZGX0ZGRkZMOwogICAgICAgICAgICAgICAgbG9uZyBlID0gc2VlZFtpXTsKICAgICAgICAgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoZSkpIHsKICAgICAgICAgICAgICAgIAlmaXJzdCA9IG1hcC5nZXQoZSk7CiAgICAgICAgICAgICAgICAJbGFzdCA9IGk7CiAgICAgICAgICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCJjeWNsZTogIiArIG1hcC5nZXQoZSkgKyAiIHRvICIgKyAoaSAtIDEpICsgIiBsZW4gIiArIChpIC0gbWFwLmdldChlKSkpOwogICAgICAgICAgICAgICAgCWJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFwLnB1dChlLCBpKTsKICAgICAgICAgICAgICAgIGlmIChlID09IDBMKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiWkVSTyEhICIgKyBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsYXN0OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgCWxvbmcgZSA9IHNlZWRbaV07CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAl0W2pdWyhpbnQpKGUgJiAweEZMKV0rKzsKICAgICAgICAgICAgICAgIAllID4+PSA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGVuZ3RoOiAiICsgc2VlZC5sZW5ndGgpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVuaXF1ZTogIiArIG1hcC5zaXplKCkpOwoJCQlTeXN0ZW0ub3V0LnByaW50ZigibGFzdDogJTh4JW4iLCBzZWVkW2xhc3QgLSAxXSk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgIAlpbnQgbSA9IDA7CiAgICAgICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IDE2OyBqKyspCiAgICAgICAgICAgIAl7CiAgICAgICAgICAgIAkJbSA9IE1hdGgubWF4KG0sIHRbaV1bal0pOwogICAgICAgICAgICAJfQogICAgICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgaisrKQogICAgICAgICAgICAJewogICAgICAgICAgICAJCVN5c3RlbS5vdXQucHJpbnRmKCIlM2QgIiwgMTAwICogdFtpXVtqXSAvIG0pOwogICAgICAgICAgICAJfQogICAgICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgIH0KCX0KfQ==