結果

問題 No.3254 Xor, Max and Sum
ユーザー tobisatis
提出日時 2025-09-05 23:07:11
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 60 ms / 2,000 ms
コード長 1,582 bytes
コンパイル時間 15,889 ms
コンパイル使用メモリ 170,008 KB
実行使用メモリ 187,064 KB
最終ジャッジ日時 2025-09-05 23:08:01
合計ジャッジ時間 18,468 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 48
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (111 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

#nullable enable

#region
var _input = Array.Empty<string>();
var _iter = 0;
string String()
{
    while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0);
    return _input[_iter++];
}
T I<T>() where T : IParsable<T> => T.Parse(String(), null);
#endregion

static long Solve(long n, long m)
{
    if (n % 2 == 0) return n * m;
    var bits = new List<int>();
    for (var i = 0; i < 31; i++)
    {
        var d = 1 << i;
        if ((m & d) > 0) bits.Add(i);
    }
    var res = (n - 1) * m;
    if (bits.Count == 1) return res;
    bits.Reverse();
    var c = 1;
    for (var i = bits[1]; i >= 0; i--)
    {
        var d = 1 << i;
        var f = m & d;
        if (f > 0)
        {
            c++;
            if (c > n) c = (int)n;
        }
        else
        {
            long k = c / 2 * 2;
            res += k * d;
        }
    }
    return res;
}

// long Naive(long n, long m)
// {
//     var f = new Dictionary<(long, long, long), long>();
//     long F(long l, long s, long x)
//     {
//         if (l == 0)
//         {
//             if (x == 0) return s;
//             else return 0;
//         }
//         var key = (l, s, x);
//         if (f.TryGetValue(key, out var cf)) return cf;
//         var res = 0L;
//         for (var i = 0L; i <= m; i++) res = Math.Max(res, F(l - 1, s + i, x ^ i));
//         return f[key] = res;
//     }
//     return F(n, 0, 0);
// }

var n = I<long>();
var m = I<long>();
var ans = Solve(n, m);
// var naive = Naive(n, m);
// if (ans != naive) throw new Exception();
Console.WriteLine(ans);
0