#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) #define int long long using namespace std; using namespace atcoder; using mint = modint998244353; const int C = 60; mint dpCnt[C + 1][2 * C + 1][2][2][2]; //(i, pop(a) - pop(b) + C, a=n, b=n, a=b) mint dpSum[C + 1][2 * C + 1][2][2][2]; signed main() { int n, i, j, k, l, m, a, b; cin >> n; dpCnt[C][C][1][1][1] = 1; dpSum[C][C][1][1][1] = 0; for (i = C; i > 0; i--) { for (j = 0; j <= 2 * C; j++) { rep(k, 2) { rep(l, 2) { rep(m, 2) { if (dpCnt[i][j][k][l][m] == 0) continue; rep(a, 2) { rep(b, 2) { if (k == 1 && a > (n >> (i - 1)) % 2) continue; if (l == 1 && b > (n >> (i - 1)) % 2) continue; if (m == 1 && a > b) continue; int nj = j; if (a == 1 && b == 0) nj++; if (a == 0 && b == 1) nj--; int nk = k && (a == (n >> (i - 1)) % 2); int nl = l && (b == (n >> (i - 1)) % 2); int nm = m && (a == b); mint kiyo = ((a & b) << i); dpCnt[i - 1][nj][nk][nl][nm] += dpCnt[i][j][k][l][m]; dpSum[i - 1][nj][nk][nl][nm] += dpSum[i][j][k][l][m] + dpCnt[i][j][k][l][m] * kiyo; } } } } } } } // dpSum[0][C][*][*][*] mint ans = 0; rep(k, 2) rep(l, 2) rep(m, 2) ans += dpSum[0][C][k][l][m]; // なぜか2で割ると答えが合う ans *= mint(2).inv(); cout << ans.val() << endl; return 0; }