class Scratch {
public static final int INITIAL_CACHE_CAPACITY = 8;
private static int[] cache = new int[INITIAL_CACHE_CAPACITY];
private static int currentMax = 1;
static {
cache[1] = 1;
}
public static void main
(String[] args
) { System.
out.
printf("fib(10) = %d%n", fib
(10)); System.
out.
printf("fib(20) = %d%n", fib
(20)); System.
out.
printf("fib(30) = %d%n", fib
(30)); System.
out.
printf("fib(40) = %d%n", fib
(40)); }
static int fib(int n) {
if (n < 0) {
}
if (n <= currentMax) {
return cache[n];
}
if (n >= cache.length) {
resizeCache(n);
}
for (int index = currentMax + 1; index <= n; ++index) {
cache[index] = cache[index - 1] + cache[index - 2];
}
if (currentMax < n) {
currentMax = n;
}
return cache[n];
}
private static void resizeCache(int minCapacity) {
int newCapacity = calculateNewCacheCapacity(minCapacity);
int currentCapacity = cache.length;
if (newCapacity < currentCapacity) {
}
int[] newCache = new int[newCapacity];
System.
arraycopy(cache,
0, newCache,
0, currentCapacity
); cache = newCache;
}
private static int calculateNewCacheCapacity(int minCapacity) {
int newSize = cache.length;
while (newSize <= minCapacity) {
newSize *= 2;
}
return newSize;
}
}
Y2xhc3MgU2NyYXRjaCB7CiAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9DQUNIRV9DQVBBQ0lUWSA9IDg7CiAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY2FjaGUgPSBuZXcgaW50W0lOSVRJQUxfQ0FDSEVfQ0FQQUNJVFldOwogIHByaXZhdGUgc3RhdGljIGludCBjdXJyZW50TWF4ID0gMTsKCiAgc3RhdGljIHsKICAgIGNhY2hlWzFdID0gMTsKICB9CgogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIFN5c3RlbS5vdXQucHJpbnRmKCJmaWIoMTApID0gJWQlbiIsIGZpYigxMCkpOwogICAgU3lzdGVtLm91dC5wcmludGYoImZpYigyMCkgPSAlZCVuIiwgZmliKDIwKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50ZigiZmliKDMwKSA9ICVkJW4iLCBmaWIoMzApKTsKICAgIFN5c3RlbS5vdXQucHJpbnRmKCJmaWIoNDApID0gJWQlbiIsIGZpYig0MCkpOwogIH0KCiAgc3RhdGljIGludCBmaWIoaW50IG4pIHsKICAgIGlmIChuIDwgMCkgewogICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuIG11c3QgYmUgPj0gMCIpOwogICAgfQogICAgaWYgKG4gPD0gY3VycmVudE1heCkgewogICAgICByZXR1cm4gY2FjaGVbbl07CiAgICB9CiAgICBpZiAobiA+PSBjYWNoZS5sZW5ndGgpIHsKICAgICAgcmVzaXplQ2FjaGUobik7CiAgICB9CiAgICBmb3IgKGludCBpbmRleCA9IGN1cnJlbnRNYXggKyAxOyBpbmRleCA8PSBuOyArK2luZGV4KSB7CiAgICAgIGNhY2hlW2luZGV4XSA9IGNhY2hlW2luZGV4IC0gMV0gKyBjYWNoZVtpbmRleCAtIDJdOwogICAgfQogICAgaWYgKGN1cnJlbnRNYXggPCBuKSB7CiAgICAgIGN1cnJlbnRNYXggPSBuOwogICAgfQogICAgcmV0dXJuIGNhY2hlW25dOwogIH0KCiAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNpemVDYWNoZShpbnQgbWluQ2FwYWNpdHkpIHsKICAJaW50IG5ld0NhcGFjaXR5ID0gY2FsY3VsYXRlTmV3Q2FjaGVDYXBhY2l0eShtaW5DYXBhY2l0eSk7CiAgICBpbnQgY3VycmVudENhcGFjaXR5ID0gY2FjaGUubGVuZ3RoOwogICAgaWYgKG5ld0NhcGFjaXR5IDwgY3VycmVudENhcGFjaXR5KSB7CiAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5ld0NhcGFjaXR5IG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgY2FwYWNpdHkiKTsKICAgIH0KICAgIGludFtdIG5ld0NhY2hlID0gbmV3IGludFtuZXdDYXBhY2l0eV07CiAgICBTeXN0ZW0uYXJyYXljb3B5KGNhY2hlLCAwLCBuZXdDYWNoZSwgMCwgY3VycmVudENhcGFjaXR5KTsKICAgIGNhY2hlID0gbmV3Q2FjaGU7CiAgfQogIAogIAogIHByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVOZXdDYWNoZUNhcGFjaXR5KGludCBtaW5DYXBhY2l0eSkgewogICAgaW50IG5ld1NpemUgPSBjYWNoZS5sZW5ndGg7CiAgICB3aGlsZSAobmV3U2l6ZSA8PSBtaW5DYXBhY2l0eSkgewogICAgICBuZXdTaXplICo9IDI7CiAgICB9CiAgICByZXR1cm4gbmV3U2l6ZTsKICB9Cn0=