#include #include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define vec vector #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define pb push_back #define eb emplace_back using namespace std; using namespace atcoder; using ll = long long; using ld = long double; const ll mod = 998244353; using mint = modint998244353; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; // using Graph = vector>>; using Graph = vector>; int main(){ // input ll n; cin >> n; // prep const int M = 60; vec binom(2*M,vec(2*M,0)); binom[0][0] = 1; rep(i,2*M-1){ binom[i+1][0] = 1; binom[i+1][i+1] = 1; rep(j,i) binom[i+1][j+1] = binom[i][j] + binom[i][j+1]; } // ref: https://atcoder.jp/contests/abc406/submissions/65914933 vec bits(M); rep(i,M) bits[i] = (n & (1LL< cnt[x][y] vec tmp(M+1,vec(M+1,vec(2,0))); vec cnt(M+1,vec(M+1,0)); tmp[0][0][1] = 1; rep(i,M) rep(j,M+1) rep(k,2) rep(l,2){ if(k && l && !bits[i]) continue; int nxt_k = (k && (l == bits[i])); tmp[i+1][j+l][nxt_k] += tmp[i][j][k]; if(l && !k){ for(int y = j; y < M; y++){ cnt[M-1-i][y] += tmp[i][j][k] * binom[M-i-1][y-j]; } } } // solve mint ans = (mint)n * (n+1) / (mint)2; rep(x,M+1){ rep(y,M) ans += (mint)(1LL<