#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001LL int main(){ long long n; cin>>n; int c = 62; vector dp(2,vector(2,vector(2,vector(130)))); dp[0][0][0][c] = 1; for(int i=59;i>=0;i--){ vector ndp(2,vector(2,vector(2,vector(130)))); rep(j,2){ rep(k,2){ rep(l,2){ rep(m,130){ if(dp[j][k][l][m]==0)continue; rep(jj,2){ rep(kk,2){ int nm = m + jj - kk; int nj = j,nk = k; if(j==0 && jj==1 && ((n>>i)&1)==0)continue; if(k==0 && kk==1 && ((n>>i)&1)==0)continue; if((n>>i)&1){ if(jj==0)nj = 1; if(kk==0)nk = 1; } ndp[nj][nk][l][nm] += dp[j][k][l][m]; if(l==0 && jj && kk){ ndp[nj][nk][1][nm] += dp[j][k][l][m] * mint(2).pow(i); } } } } } } } swap(dp,ndp); } mint ans = 0; rep(i,2){ rep(j,2){ ans += dp[i][j][1][c]; } } mint t = n; t *= n+1; t /= 2; ans += t; ans /= 2; cout<