import java.util.*;
import java.lang.*;
interface Callback {
void visit(int[] p); // n-dimensional point
}
public class Main
{
// bounds[] - each number the limits iteration on i'th axis from 0 to bounds[i]
// current - current dimension
// callback - point
public static void visit(int[] bounds, int currentDimension, int[] p, Callback c) {
//c.visit(p);
//if (currentDimension == p.length) return; // stop recursion
for (int i = 0; i < bounds[currentDimension]; i++) {
p[currentDimension] = i;
if (currentDimension == p.length - 1) c.visit(p);
else visit(bounds, currentDimension + 1, p, c);
}
}
static long visits = 0;
/// now visiting
public static void main
(String[] args
) { long start
= System.
currentTimeMillis(); visit(new int[] {50, 50, 50, 50}, 0, new int[4], new Callback() {
public void visit(int[] p) {
//System.out.println(Arrays.toString(p));
visits++;
}
});
long end
= System.
currentTimeMillis(); System.
out.
println(visits
+ " visits"); System.
out.
println("Time: " + (end
- start
) + " ms"); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CgppbnRlcmZhY2UgQ2FsbGJhY2sgewogICB2b2lkIHZpc2l0KGludFtdIHApOyAvLyBuLWRpbWVuc2lvbmFsIHBvaW50Cn0KCnB1YmxpYyBjbGFzcyBNYWluCnsKCgkvLyBib3VuZHNbXSAtIGVhY2ggbnVtYmVyIHRoZSBsaW1pdHMgaXRlcmF0aW9uIG9uIGkndGggYXhpcyBmcm9tIDAgdG8gYm91bmRzW2ldCgkvLyBjdXJyZW50IC0gY3VycmVudCBkaW1lbnNpb24KCS8vIGNhbGxiYWNrIC0gcG9pbnQKCXB1YmxpYyBzdGF0aWMgdm9pZCB2aXNpdChpbnRbXSBib3VuZHMsIGludCBjdXJyZW50RGltZW5zaW9uLCBpbnRbXSBwLCBDYWxsYmFjayBjKSB7CgkJLy9jLnZpc2l0KHApOwoJCS8vaWYgKGN1cnJlbnREaW1lbnNpb24gPT0gcC5sZW5ndGgpIHJldHVybjsgLy8gc3RvcCByZWN1cnNpb24KCQlmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kc1tjdXJyZW50RGltZW5zaW9uXTsgaSsrKSB7CgkJCXBbY3VycmVudERpbWVuc2lvbl0gPSBpOwoJCQlpZiAoY3VycmVudERpbWVuc2lvbiA9PSBwLmxlbmd0aCAtIDEpIGMudmlzaXQocCk7CgkJCWVsc2UgdmlzaXQoYm91bmRzLCBjdXJyZW50RGltZW5zaW9uICsgMSwgcCwgYyk7CgkJfQoJfQoKCXN0YXRpYyBsb25nIHZpc2l0cyA9IDA7CgkvLy8gbm93IHZpc2l0aW5nCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCXZpc2l0KG5ldyBpbnRbXSB7NTAsIDUwLCA1MCwgNTB9LCAwLCBuZXcgaW50WzRdLCBuZXcgQ2FsbGJhY2soKSB7CgkJICAgcHVibGljIHZvaWQgdmlzaXQoaW50W10gcCkgewoJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKHApKTsKCQkJCXZpc2l0cysrOwoJCSAgIH0KCQl9KTsKCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCVN5c3RlbS5vdXQucHJpbnRsbih2aXNpdHMgKyAiIHZpc2l0cyIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZTogIiArIChlbmQgLSBzdGFydCkgKyAiIG1zIik7Cgl9Cgp9