import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicLong;
public class Main {
public static void main
(String[] args
) { AtomicLong same = new AtomicLong();
AtomicLong diff = new AtomicLong();
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new Count(0, 0x100000000l, same, diff));
System.
out.
printf("same = %d, different = %d\n", same.
get(), diff.
get()); }
public static class Count extends RecursiveAction {
private static final long serialVersionUID = -6040618696103638659L;
protected final long max, min;
protected final AtomicLong same, diff;
public Count(long min, long max, AtomicLong same, AtomicLong diff) {
this.min = min;
this.max = max;
this.same = same;
this.diff = diff;
}
@Override
protected void compute() {
if (max - min <= (1 << 16)) {
int same = 0;
int diff = 0;
for (long i = this.min; i < this.max ; i++) {
float f
= Float.
intBitsToFloat((int)i
); if (f * 1.0f == f) {
same++;
} else {
diff++;
}
}
this.diff.addAndGet(diff);
this.same.addAndGet(same);
} else {
long mid = min + (max - min) / 2;
invokeAll(new Count(min, mid, same, diff), new Count(mid, max, same, diff));
}
}
}
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZvcmtKb2luUG9vbDsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlY3Vyc2l2ZUFjdGlvbjsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwoKCnB1YmxpYyBjbGFzcyBNYWluIHsKCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJQXRvbWljTG9uZyBzYW1lID0gbmV3IEF0b21pY0xvbmcoKTsKCQlBdG9taWNMb25nIGRpZmYgPSBuZXcgQXRvbWljTG9uZygpOwoJCQoJCUZvcmtKb2luUG9vbCBwb29sID0gbmV3IEZvcmtKb2luUG9vbCgpOwoJCXBvb2wuaW52b2tlKG5ldyBDb3VudCgwLCAweDEwMDAwMDAwMGwsIHNhbWUsIGRpZmYpKTsKCgkJU3lzdGVtLm91dC5wcmludGYoInNhbWUgPSAlZCwgZGlmZmVyZW50ID0gJWRcbiIsIHNhbWUuZ2V0KCksIGRpZmYuZ2V0KCkpOwoJfQoKCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnQgZXh0ZW5kcyBSZWN1cnNpdmVBY3Rpb24gewoKCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjA0MDYxODY5NjEwMzYzODY1OUw7CgkJCgkJcHJvdGVjdGVkIGZpbmFsIGxvbmcgbWF4LCBtaW47CgkJcHJvdGVjdGVkIGZpbmFsIEF0b21pY0xvbmcgc2FtZSwgZGlmZjsKCQkKCQlwdWJsaWMgQ291bnQobG9uZyBtaW4sIGxvbmcgbWF4LCBBdG9taWNMb25nIHNhbWUsIEF0b21pY0xvbmcgZGlmZikgewoJCQl0aGlzLm1pbiA9IG1pbjsKCQkJdGhpcy5tYXggPSBtYXg7CgkJCXRoaXMuc2FtZSA9IHNhbWU7CgkJCXRoaXMuZGlmZiA9IGRpZmY7CgkJfQoKCQlAT3ZlcnJpZGUKCQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlKCkgewoJCQlpZiAobWF4IC0gbWluIDw9ICgxIDw8IDE2KSkgewoJCQkJaW50IHNhbWUgPSAwOwoJCQkJaW50IGRpZmYgPSAwOwoJCQkJCgkJCQlmb3IgKGxvbmcgaSA9IHRoaXMubWluOyBpIDwgdGhpcy5tYXggOyBpKyspIHsKCQkJCQlmbG9hdCBmID0gRmxvYXQuaW50Qml0c1RvRmxvYXQoKGludClpKTsKCQkJCQlpZiAoZiAqIDEuMGYgPT0gZikgewoJCQkJCQlzYW1lKys7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZGlmZisrOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJdGhpcy5kaWZmLmFkZEFuZEdldChkaWZmKTsKCQkJCXRoaXMuc2FtZS5hZGRBbmRHZXQoc2FtZSk7CgkJCX0gZWxzZSB7CgkJCQlsb25nIG1pZCA9IG1pbiArIChtYXggLSBtaW4pIC8gMjsKCQkJCWludm9rZUFsbChuZXcgQ291bnQobWluLCBtaWQsIHNhbWUsIGRpZmYpLCBuZXcgQ291bnQobWlkLCBtYXgsIHNhbWUsIGRpZmYpKTsKCQkJfQoJCX0KCgl9Cn0K