結果

問題 No.752 mod数列
コンテスト
ユーザー 👑 kakel-san
提出日時 2026-09-26 23:24:05
言語 C#
(.NET 10.0.400 + ACL)
コンパイル:
dotnet_c
実行:
/usr/bin/dotnet_wrap
結果
AC  
実行時間 186 ms / 2,000 ms
+ 813µs
コード長 2,734 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 14,379 ms
コンパイル使用メモリ 176,172 KB
実行使用メモリ 84,012 KB
最終ジャッジ日時 2026-09-26 23:24:31
合計ジャッジ時間 24,830 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge4_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 31
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (237 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net10.0/main.dll
  main -> /home/judge/data/code/bin/Release/net10.0/publish/

ソースコード

diff #
raw source code

using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static int NN => int.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var c = NList;
        var (p, q) = (c[0], c[1]);
        var query = NArr(q);
        WriteLine(string.Join("\n", ModList(p, q, query)));
    }
    static long[] ModList(int p, int q, int[][] query)
    {
        var rp = (int)Math.Sqrt(p);
        var dic = new Dictionary<int, List<int>>();
        for (var i = 1; p / i > rp; ++i)
        {
            if (dic.ContainsKey(p / i)) dic[p / i].Add(i);
            else dic[p / i] = new List<int>() { i };
        }
        var list1 = dic.Keys.ToList();
        list1.Sort((l, r) => r.CompareTo(l));
        var list2 = new List<int>();
        for (var i = rp; i > 0; --i) list2.Add(i);
        var max = new int[list1.Count + list2.Count];
        var count = new int[list1.Count + list2.Count];
        var sum = new long[list1.Count + list2.Count];
        for (var i = 0; i < list1.Count; ++i)
        {
            count[i] = dic[list1[i]].Count;
            foreach (var li in dic[list1[i]]) sum[i] += p % li;
            max[i] = dic[list1[i]][^1];
        }
        for (var i = 0; i < list2.Count; ++i)
        {
            var le = p / list2[i] - p / (list2[i] + 1);
            var fi = p % list2[i];
            count[i + list1.Count] = le;
            sum[i + list1.Count] = (long)fi * le + (long)list2[i] * le * (le - 1) / 2;
            max[i + list1.Count] = p / list2[i];
        }
        var cum = new long[sum.Length];
        cum[0] = sum[0];
        for (var i = 1; i < cum.Length; ++i) cum[i] = cum[i - 1] + sum[i];
        var ans = new long[q];
        for (var i = 0; i < q; ++i)
        {
            ans[i] = Calc(p, max, count, cum, query[i][1]) - Calc(p, max, count, cum, query[i][0] - 1);
        }
        return ans;
    }
    static long Calc(int p, int[] max, int[] count, long[] cum, int e)
    {
        if (e == 0) return 0;
        if (e >= p) return cum[^1] + (long)p * (e - p);
        var ok = 0;
        var ng = max.Length;
        while (ng - ok > 1)
        {
            var mid = (ok + ng) / 2;
            if (max[mid] <= e) ok = mid;
            else ng = mid;
        }
        if (max[ok] == e) return cum[ok];
        var d = p / max[ok + 1];
        var l = e - max[ok];
        var f = p % max[ok + 1] + (long)(count[ok + 1] - l) * d;
        return f * l + (long)d * l * (l - 1) / 2 + cum[ok];
    }
}
0