#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func 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(); var k = I(); var m = I(); var bz = Range(n, I); var cz = Range(n, I); 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 t = m - s; var k0q = ModDiv(t, 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; } } s = (s + d * p) % m; break; } } } Console.WriteLine(ans);