#include <stdio.h>
#include <stdint.h>
#include <unordered_set>
#include <vector>
uint32_t f(uint32_t n, uint32_t m) {
if (n < 9) {
n += m;
}
uint64_t t = 0;
uint32_t a = n % m;
for (int i = 31; i >= 0; i--) {
t = (t * (a - 1) + 2) % m * t % m;
if (a & 1u << i) {
t = (t * a + 1) % m;
}
}
return (uint32_t)(t * a % m);
}
int main() {
const uint32_t m = 1000000000;
const uint32_t n = 20200117;
std::unordered_set < uint32_t > v_set;
std::vector < uint32_t > v_vect;
int c0, c1;
uint32_t t = n % m;
for (int i = 0; ; i++) {
if (v_set.find(t) != v_set.end()) {
c1 = i;
break;
}
v_set.insert(t);
v_vect.push_back(t);
t = f(t, m);
}
for (int i = 0; ; i++) {
if (v_vect[i] == t) {
c0 = i;
break;
}
}
int c = n % (c1 - c0);
if (c < c0) {
c += c1 - c0;
}
printf("%u\n", v_vect[c]);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1aW50MzJfdCBmKHVpbnQzMl90IG4sIHVpbnQzMl90IG0pIHsKCWlmIChuIDwgOSkgewoJCW4gKz0gbTsKCX0KCXVpbnQ2NF90IHQgPSAwOwoJdWludDMyX3QgYSA9IG4gJSBtOwoJZm9yIChpbnQgaSA9IDMxOyBpID49IDA7IGktLSkgewoJCXQgPSAodCAqIChhIC0gMSkgKyAyKSAlIG0gKiB0ICUgbTsKCQlpZiAoYSAmIDF1IDw8IGkpIHsKCQkJdCA9ICh0ICogYSArIDEpICUgbTsKCQl9Cgl9CglyZXR1cm4gKHVpbnQzMl90KSh0ICogYSAlIG0pOwp9CgppbnQgbWFpbigpIHsKCWNvbnN0IHVpbnQzMl90IG0gPSAxMDAwMDAwMDAwOwoJY29uc3QgdWludDMyX3QgbiA9IDIwMjAwMTE3OwoJc3RkOjp1bm9yZGVyZWRfc2V0IDwgdWludDMyX3QgPiB2X3NldDsKCXN0ZDo6dmVjdG9yIDwgdWludDMyX3QgPiB2X3ZlY3Q7CglpbnQgYzAsIGMxOwoJdWludDMyX3QgdCA9IG4gJSBtOwoJZm9yIChpbnQgaSA9IDA7IDsgaSsrKSB7CgkJaWYgKHZfc2V0LmZpbmQodCkgIT0gdl9zZXQuZW5kKCkpIHsKCQkJYzEgPSBpOwoJCQlicmVhazsKCQl9CgkJdl9zZXQuaW5zZXJ0KHQpOwoJCXZfdmVjdC5wdXNoX2JhY2sodCk7CgkJdCA9IGYodCwgbSk7Cgl9Cglmb3IgKGludCBpID0gMDsgOyBpKyspIHsKCQlpZiAodl92ZWN0W2ldID09IHQpIHsKCQkJYzAgPSBpOwoJCQlicmVhazsKCQl9Cgl9CglpbnQgYyA9IG4gJSAoYzEgLSBjMCk7CglpZiAoYyA8IGMwKSB7CgkJYyArPSBjMSAtIGMwOwoJfQoJcHJpbnRmKCIldVxuIiwgdl92ZWN0W2NdKTsKCXJldHVybiAwOwp9Cg==