結果

問題 No.3266 岩井星人は見ずにはいられない
ユーザー tobisatis
提出日時 2025-09-06 15:40:59
言語 C#
(.NET 8.0.404)
結果
WA  
実行時間 -
コード長 1,870 bytes
コンパイル時間 13,035 ms
コンパイル使用メモリ 170,224 KB
実行使用メモリ 39,972 KB
最終ジャッジ日時 2025-09-06 15:41:16
合計ジャッジ時間 14,611 ms
ジャッジサーバーID
(参考情報)
judge4 / judge
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 4
other WA * 10 TLE * 1 -- * 20
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (104 ミリ秒)。
  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

var n = I<int>();
var a = I<long>();
var s = String().Select(c => c - '0').ToArray();
var ss = new int[n * 2 + 1];
for (var i = 1; i <= n * 2; i++) ss[i] = ss[i - 1] + s[i % n];

var nexts = new int[n];
nexts.AsSpan().Fill(-1);
long G(int p, long k)
{
    var dk = ss[p + n] - ss[p];
    var rep = k / dk;
    k -= rep * dk;
    return rep * n + F(p, k, 1);
}
long F(int p, long k, int last)
{
    if (last < 2 && nexts[p] >= 0)
    {
        var t = p;
        var res = 0L;
        var sdk = 0;
        while (true)
        {
            var next = nexts[t];
            var dk = ss[next] - ss[t];
            if (next <= t) dk = ss[next + n] - ss[t];
            dk--;
            if (dk >= k) return res + F(t, k, 2);
            k -= dk;
            sdk += dk;
            res += next - t;
            if (next <= t) res += n;
            t = next;
            if (t == p) break;
        }
        var rep = k / sdk;
        res *= rep + 1;
        k -= rep * sdk;
        if (k == 0) return res;
        return res + F(p, k, last);
    }
    var r = 1200;
    var i = 0;
    var j = p;
    while (true)
    {
        if (last < 2 && i >= n) break;
        if (r > 1200)
        {
            nexts[p] = j;
            var d = j - p;
            if (d <= 0) d += n;
            return F(j, k, last) + d;
        }
        if (s[j] == 0) r--;
        else
        {
            if (r < 1200) k--;
            r++;
            if (k == 0) return i + 1;
        }
        j++;
        if (j == n) j = 0;
    }
    return G(p, k) + n;
}
var ans = F(0, a, 0);
Console.WriteLine(ans);
0