#include <iostream>
#include <ctime>
#include <cstdint>
using std::cout;
using std::endl;
std::uint32_t rand_value;
std::uint32_t lcg()
{
const auto a = 22695477u;
const auto c = 1u;
rand_value = a * rand_value + c;
return rand_value;
}
enum func_method {log_or, mult};
template <typename test_type, func_method method>
void test_func()
{
const unsigned long end = 800'000'000;
unsigned int sum = 0;
auto clock_begin = std::clock();
if (method == func_method::log_or)
for (unsigned long i = 0; i < end; ++i)
{
test_type a = lcg();
test_type b = lcg();
if (a == 0 || b == 0)
++sum;
}
else if (method == func_method::mult)
for (unsigned long i = 0; i < end; ++i)
{
test_type a = lcg();
test_type b = lcg();
if (a * b == 0)
++sum;
}
else
cout << "Invalid method" << endl;
auto clock_end = std::clock();
cout << "sum: " << sum << endl;
cout << "time: " << double(clock_end - clock_begin) / CLOCKS_PER_SEC << endl;
}
int main()
{
typedef double test_type;
rand_value = 1;
test_func<test_type, func_method::mult>();
rand_value = 1;
test_func<test_type, func_method::log_or>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkaW50Pgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKCnN0ZDo6dWludDMyX3QgcmFuZF92YWx1ZTsKCnN0ZDo6dWludDMyX3QgbGNnKCkKewoJY29uc3QgYXV0byBhID0gMjI2OTU0Nzd1OwoJY29uc3QgYXV0byBjID0gMXU7CgoJcmFuZF92YWx1ZSA9IGEgKiByYW5kX3ZhbHVlICsgYzsKCXJldHVybiByYW5kX3ZhbHVlOwp9CgplbnVtIGZ1bmNfbWV0aG9kIHtsb2dfb3IsIG11bHR9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIHRlc3RfdHlwZSwgZnVuY19tZXRob2QgbWV0aG9kPgp2b2lkIHRlc3RfZnVuYygpCnsKCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kID0gODAwJzAwMCcwMDA7Cgl1bnNpZ25lZCBpbnQgc3VtID0gMDsKCglhdXRvIGNsb2NrX2JlZ2luID0gc3RkOjpjbG9jaygpOwoJaWYgKG1ldGhvZCA9PSBmdW5jX21ldGhvZDo6bG9nX29yKQoJCWZvciAodW5zaWduZWQgbG9uZyBpID0gMDsgaSA8IGVuZDsgKytpKQoJCXsKCQkJdGVzdF90eXBlIGEgPSBsY2coKTsKCQkJdGVzdF90eXBlIGIgPSBsY2coKTsKCQkJaWYgKGEgPT0gMCB8fCBiID09IDApCgkJCQkrK3N1bTsKCQl9CgllbHNlIGlmIChtZXRob2QgPT0gZnVuY19tZXRob2Q6Om11bHQpCgkJZm9yICh1bnNpZ25lZCBsb25nIGkgPSAwOyBpIDwgZW5kOyArK2kpCgkJewoJCQl0ZXN0X3R5cGUgYSA9IGxjZygpOwoJCQl0ZXN0X3R5cGUgYiA9IGxjZygpOwoJCQlpZiAoYSAqIGIgPT0gMCkKCQkJCSsrc3VtOwoJCX0KCWVsc2UKCQljb3V0IDw8ICJJbnZhbGlkIG1ldGhvZCIgPDwgZW5kbDsKCWF1dG8gY2xvY2tfZW5kID0gc3RkOjpjbG9jaygpOwoKCWNvdXQgPDwgInN1bTogICIgPDwgc3VtIDw8IGVuZGw7Cgljb3V0IDw8ICJ0aW1lOiAiIDw8IGRvdWJsZShjbG9ja19lbmQgLSBjbG9ja19iZWdpbikgLyBDTE9DS1NfUEVSX1NFQyA8PCBlbmRsOwp9CgppbnQgbWFpbigpCnsKCXR5cGVkZWYgZG91YmxlIHRlc3RfdHlwZTsKCQoJcmFuZF92YWx1ZSA9IDE7Cgl0ZXN0X2Z1bmM8dGVzdF90eXBlLCBmdW5jX21ldGhvZDo6bXVsdD4oKTsKCXJhbmRfdmFsdWUgPSAxOwoJdGVzdF9mdW5jPHRlc3RfdHlwZSwgZnVuY19tZXRob2Q6OmxvZ19vcj4oKTsKCglyZXR1cm4gMDsKfQ==