#include using namespace std; using ll = long long; #include using namespace atcoder; using mint = modint998244353; int done_build_fact = 0; vector fac; vector inv; // 998244353 void build_fact(int N){ fac.resize(N+1); inv.resize(N+1); fac[0] = 1; for(int i = 1; i <= N; i++)fac[i] = fac[i-1] * i; inv[N] = fac[N].pow(998244353-2); for(int i = N-1; i >= 0; --i)inv[i] = inv[i+1] * (i+1); done_build_fact = N; } mint binom(int n , int k){ if(n < k)return 0; assert(done_build_fact >= n); return fac[n] * inv[k] * inv[n-k]; } // Don't forget calling build_fact int main() { ll n; cin >> n; mint ans = 0; vector d; ll m = n; for(int i = 0; i < 60; i++){ d.push_back(m%2); m /= 2; } reverse(d.begin(), d.end()); for(int i = 0; i < 60; i++){ vector>> dp(61, vector>(60, vector(2))); dp[0][0][0] = 1; for(int j = 0; j < 60; j++){ for(int k = 0; k < 59; k++){ for(int l = 0; l < 2; l++){ for(int nxt = 0; nxt <= 1; nxt++){ if(j == i && nxt == 0)continue; int nj = j + 1; int nk = k + nxt; int nl = l; if(d[j] < nxt && l == 0)continue; if(d[j] > nxt)nl = 1; dp[nj][nk][nl] += dp[j][k][l]; } } } } for(int j = 0; j < 60; j++){ mint tmp = dp[60][j][0] + dp[60][j][1]; ans += (1LL<<(59-i)) * (tmp * (tmp - 1) / 2 + tmp); } } cout << ans.val() << endl; }