結果
| 問題 | No.3516 Very Large Range Mod |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-24 22:52:38 |
| 言語 | C# (.NET 10.0.201) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,620 bytes |
| 記録 | |
| コンパイル時間 | 13,130 ms |
| コンパイル使用メモリ | 173,128 KB |
| 実行使用メモリ | 248,332 KB |
| 最終ジャッジ日時 | 2026-04-24 22:53:07 |
| 合計ジャッジ時間 | 23,764 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 26 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (223 ミリ秒)。 main -> /home/judge/data/code/bin/Release/net10.0/main.dll main -> /home/judge/data/code/bin/Release/net10.0/publish/
ソースコード
#nullable enable
#region
var (_input, _iter) = (Array.Empty<string>(), 0);
T I<T>() where T : IParsable<T>
{
while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0);
return T.Parse(_input[_iter++], null);
}
#endregion
static T[] Range<T>(int n, Func<T> F) => Enumerable.Range(0, n).Select(_ => F()).ToArray();
static (long d, long x, long y) ExtendedGCD(long a, long b)
{
var (x0, y0, x1, y1) = (1L, 0L, 0L, 1L);
while (b != 0)
{
var q = a / b;
(a, b) = (b, a - q * b);
(x0, y0, x1, y1) = (x1, y1, x0 - q * x1, y0 - q * y1);
}
return (a, x0, y0);
}
static long? ModDiv(long a, long b, long m)
{
if (b == 0) throw new DivideByZeroException();
var (d, t, _) = ExtendedGCD(b, m);
if (a % d != 0) return null;
if (d < 0) (d, t) = (-d, -t);
var dm = m / d;
var y = (long)((Int128)a / d * t % dm);
if (y < 0) y += dm;
return y;
}
var n = I<int>();
var k = I<int>();
var m = I<int>();
var bz = Range(n, I<int>);
var cz = Range(n, I<long>);
var s = 0L;
var (ri, rj) = (0, 0);
while (k > 0)
{
var (b, c) = (bz[ri], cz[ri]);
if (b <= k)
{
ri++;
k -= b;
s += c * b;
s %= m;
continue;
}
rj = k;
s += c * rj;
s %= m;
break;
}
var (li, lj) = (0, 0);
var ans = 0;
if (s == 0) ans = 1;
while (ri < n)
{
var (bl, cl) = (bz[li], cz[li]);
var (br, cr) = (bz[ri], cz[ri]);
var p = Math.Min(bl - lj, br - rj);
lj += p;
rj += p;
if (lj == bl) (li, lj) = (li + 1, 0);
if (rj == br) (ri, rj) = (ri + 1, 0);
var d = (cr - cl) % m;
if (d < 0) d += m;
while (p > 0)
{
if (d == 0)
{
if (s == 0) ans += p;
break;
}
if (s > 0)
{
var k0q = ModDiv(m - s, d, m);
if (k0q != null)
{
var k0 = (int)k0q.Value;
if (k0 <= p)
{
s = 0;
ans++;
p -= k0;
}
}
if (s != 0)
{
s = (s + d * p) % m;
break;
}
}
{
var k0q = ModDiv(m, d, m);
if (k0q != null)
{
var k0 = (int)k0q.Value;
if (k0 > 0)
{
var q = p / k0;
ans += q;
p -= q * k0;
}
}
s = (s + d * p) % m;
break;
}
}
}
Console.WriteLine(ans);