結果
| 問題 | No.752 mod数列 |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-09-26 23:24:05 |
| 言語 | C# (.NET 10.0.400 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 186 ms / 2,000 ms |
| + 813µs | |
| コード長 | 2,734 bytes |
| 記録 | |
| コンパイル時間 | 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/
ソースコード
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];
}
}