#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 var n = I(); var p = I(); var c = I(); var bz = new List>(); { var cl = new List(); for (var i = 0; i < n; i++) { var a = I(); if (a == 0) { if (cl.Count > 0) { bz.Add(cl); cl = []; } } else cl.Add(a); } if (cl.Count > 0) bz.Add(cl); } int invC; { var cv = 1L; long ck = c; var cp = p - 2; while (cp > 0) { if ((cp & 1) != 0) cv = cv * ck % p; ck = ck * ck % p; cp >>= 1; } invC = (int)cv; } var ans = 0L; if (c == 0) { ans = (long)n * (n - 1) / 2 + n; foreach (var b in bz) { var len = b.Count; ans -= (long)len * (len - 1) / 2 + len; } } else { foreach (var b in bz) { var data = new HashMap(){ [1] = 1 }; var last = 1L; foreach (var v in b) { var next = last * v % p; var k = next * invC % p; ans += data[(int)k]; last = next; data[(int)last]++; } } } Console.WriteLine(ans); class HashMap : Dictionary where K : notnull where V : struct { public new V this[K k] { get => TryGetValue(k, out var value) ? value : base[k] = default; set { base[k] = value; } } }