移植
题号:NC296306
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

被奥比土带回基地的小 Z 决定移植眼睛,于是奥比土开始动手术。
在手术过程中,奥比土发现小 Z 的写轮眼总是乱动,于是他想找到一个不动点方便手术。
具体来说,他可以把小 Z 的眼睛看成一个非负整数 x,且
  • f(x) 表示 x 在二进制下 1 的个数,
  • g(x) 表示 x 在二进制下 0 的个数 +1(不考虑前导零)。
奥比土会进行复合操作 x := g(f(x)) 若干次。
  • := 是赋值运算符,例如 x := y 的意思是把 y 的值赋给 x
不动点的定义:对于非负整数 x,对其进行若干次操作后得到 x_0,若 x_0 \equiv g(f(x_0)),则称 x_0x 的不动点。
  • \equiv 表示恒等,例如 1 \equiv 1
现在给定一个非负整数 x,你需要帮奥比土判断其是否有不动点,若有则输出这个不动点 x_0,否则输出 -1

输入描述:

一个非负整数 x \ (0 \leq x \leq 10^{18})

输出描述:

一个整数,表示不动点 x_0-1
示例1

输入

复制
4

输出

复制
1

说明

\text{f(4) = 1, g(1) = 1}
示例2

输入

复制
0

输出

复制
1

说明

\text{f(0) = 0, g(0) = 1}