#include #include using namespace std; const int mod = 998244353, inv2 = 499122177; int pow2[70], dp[70][70][2]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); long long n; cin >> n; int m = 64 - __builtin_clzll((unsigned long long)n); pow2[0] = 1; for (int i = 1; i <= m + 1; i++) { pow2[i] = (pow2[i - 1] << 1) % mod; } int ans = 0; for (int i = 1; i <= m; i++) { memset(dp, 0, sizeof(dp)); dp[m][0][0] = 1; for (int pos = m; pos >= 1; pos--) { for (int cnt = 0; cnt <= m; cnt++) { for (int flag = 0; flag < 2; flag++) { if (!dp[pos][cnt][flag]) { continue; } int g = flag ? 1 : (n >> (pos - 1)) & 1; for (int j = 0; j <= g; j++) { if (pos == i && (!j)) { continue; } int nflag = flag || (j < g); dp[pos - 1][cnt + j][nflag] = ((long long)dp[pos - 1][cnt + j][nflag] + dp[pos][cnt][flag]) % mod; } } } } for (int t = 1; t <= m; t++) { long long c = (dp[0][t][0] + dp[0][t][1]) % mod, k = c * ((c + 1) % mod) % mod * inv2 % mod; ans = (ans + pow2[i - 1] * k % mod) % mod; } } cout << ans; cout.flush(); return 0; }