#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion const int Mod = 998244353; var n = I(); var f = new Dictionary<(long, long, int, int), (long, long)>(); (long, long) F(long za, long zb, int zd, int comp) { if (za == 0 && zb == 0) { if (zd != 0) return (0, 0); if (comp < 0) return (0, 0); return (0, 1); } var key = (za, zb, zd, comp); if (f.TryGetValue(key, out var cv)) return cv; var rv = 0L; var rc = 0L; { var (v00, c00) = F(za >> 1, zb >> 1, zd, comp); rv += v00 * 2; rc += c00; } if (za > 0) { var (v10, c10) = F((za - 1) >> 1, zb >> 1, zd - 1, -1); rv += v10 * 2; rc += c10; } if (zb > 0) { var (v01, c01) = F(za >> 1, (zb - 1) >> 1, zd + 1, 1); rv += v01 * 2; rc += c01; } if (za > 0 && zb > 0) { var (v11, c11) = F((za - 1) >> 1, (zb - 1) >> 1, zd, comp); rv += v11 * 2 + c11; rc += c11; } return f[key] = (rv % Mod, rc % Mod); } var ans = F(n, n, 0, 0).Item1; Console.WriteLine(ans);