// #pragma GCC target("avx") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; #define rep(i,n) for(int i = 0; i < (int)n; i++) #define FOR(n) for(int i = 0; i < (int)n; i++) #define repi(i,a,b) for(int i = (int)a; i < (int)b; i++) #define all(x) x.begin(),x.end() //#define mp make_pair #define vi vector #define vvi vector #define vvvi vector #define vvvvi vector #define pii pair #define vpii vector> template void chmax(T &a, const T &b) {a = (a > b? a : b);} template void chmin(T &a, const T &b) {a = (a < b? a : b);} using ll = long long; using ld = long double; using ull = unsigned long long; const ll INF = numeric_limits::max() / 2; const ld pi = 3.1415926535897932384626433832795028; const ll mod = 998244353; int dx[] = {1, 0, -1, 0, -1, -1, 1, 1}; int dy[] = {0, 1, 0, -1, -1, 1, -1, 1}; #define int long long vector quotients(const int n) { vector ret; for(int i = 1; i * i <= n; i++) { if(n%i != 0) continue; ret.push_back(i); if(i * i != n) ret.push_back(n / i); } sort(all(ret)); return ret; } void solve() { unordered_set st; int tmp = 1; while(2 * tmp <= 1000000000) { tmp *= 2; vi quots = quotients(tmp-1); for(auto e : quots) st.insert(tmp); } int n; cin >> n; unordered_map memo; memo[1] = 1; auto cal = [&](int x, auto self) -> int { if(memo[x] != 0) return memo[x]; if(x%2 == 0) { while(x % 2 == 0) x /= 2; return memo[x] = self(x, self) + 1; }else { //奇数倍 if(st.find(x) != st.end()) return memo[x] = 2; return memo[x] = self(x + 1, self) + 1; } }; cout << cal(n, cal) - 1 << endl; } signed main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }