#include #include #include using namespace std; struct Comb { std::vector fac, finv, inv; const int mod; Comb(const int max, const int m) : mod(m), fac(max + 5), finv(max + 5), inv(max + 5) { fac[0] = fac[1] = finv[0] = finv[1] = inv[1] = 1; for (int i = 2; i < max + 5; ++i) { fac[i] = fac[i - 1] * i % mod; inv[i] = mod - inv[mod % i] * (mod / i) % mod; finv[i] = finv[i - 1] * inv[i] % mod; } } long long c(int n, int k) { if (n < k || n < 0 || k < 0) return 0; return fac[n] * (finv[k] * finv[n - k] % mod) % mod; } long long p(int n, int k) { if (n < k || n < 0 || k < 0) return 0; return fac[n] * finv[n - k] % mod; } }; int main() { const int mod = 998244353, b = 60; long long n; cin >> n; Comb cb(2 * b, mod); vector bit; { long long tmp = n; while (tmp > 0) { bit.push_back(tmp % 2); tmp /= 2; } } int nowc = 0, siz = bit.size(); vector> cnt(siz, vector (siz + 1)); { int sum = 0; for (int i = 0; i < siz; ++i) sum += bit[i]; for (int i = 0; i < siz; ++i) if (bit[i]) cnt[i][sum] = 1; } for (int i = siz - 1; i >= 0; --i) { if (bit[i] == 1) { for (int j = 0; j <= i; ++j) { for (int k = i + 1; k < siz; ++k) { if (bit[k]) { cnt[k][nowc + j] += cb.c(i, j); cnt[k][nowc + j] %= mod; } } for (int k = 0; k < i; ++k) { cnt[k][nowc + j] += cb.c(i - 1, j - 1); cnt[k][nowc + j] %= mod; } } ++nowc; } } // for (int i = 0; i < siz; ++i) cout << bit[i] << " \n"[i == siz - 1]; // for (int i = 0; i < siz; ++i) // { // for (int j = 0; j <= siz; ++j) cout << cnt[i][j] << " \n"[j == siz]; // } long long ans = n % mod * ((n + 1) % mod) % mod * 499122177LL % mod; ans = -ans % mod + mod; for (int i = 0; i < siz; ++i) { for (int j = 0; j <= siz; ++j) { ans = (ans + (1LL << i) % mod * cnt[i][j] % mod * cnt[i][j] % mod) % mod; } } ans = ans * 499122177 % mod; ans += n % mod * ((n + 1) % mod) % mod * 499122177 % mod; ans %= mod; cout << ans << endl; }