#include #include using namespace std; using mint = atcoder::modint998244353; using ll = long long; int main(){ ll n; cin >> n; const int lg = __lg(n); mint ans; auto f = [&](int b){ vector dp(2, vector(1)); dp[1][0] = 1; for(int i = lg; i >= 0; i--){ const int sz = lg - i + 1; vector ndp(2, vector(sz + 1)); for(int j = 0; j < 2; j++){ int r = j ? (n >> i) & 1 : 1; for(int k = 0; k < sz; k++){ for(int l = (i == b); l <= r; l++){ ndp[j & (l == r)][k + l] += dp[j][k]; } } } swap(dp, ndp); } mint coef; for(int i = 1; i <= lg + 1; i++){ mint tmp = dp[0][i] + dp[1][i]; coef += tmp * (tmp + 1); } ans += coef * mint::raw(998244354 / 2) * mint(1ll << b); }; for(int i = 0; i <= lg; i++) f(i); cout << ans.val() << '\n'; }