public override IEnumerable <object> Solve(TextReader inputStream) { var n = inputStream.ReadInt(); var s = inputStream.ReadLine(); if (s[0] == 'W' || s[^ 1] == 'W') { yield return(0); yield break; } var edges = new Edge[s.Length]; var last = s[0]; for (int i = 1; i < s.Length; i++) { if (s[i] != last) { edges[i] = edges[i - 1]; } else { edges[i] = edges[i - 1] == Edge.Left ? Edge.Right : Edge.Left; } last = s[i]; } if (edges.Count(e => e == Edge.Left) != n) { yield return(0); yield break; } var count = Modular.One; var leftCount = 0; foreach (var edge in edges) { if (edge == Edge.Left) { leftCount++; } else { count *= leftCount--; } } count *= Modular.Factorial(n); yield return(count); }
public override IEnumerable <object> Solve(TextReader inputStream) { var nm = inputStream.ReadIntArray(); var dogs = nm[0]; var monkeys = nm[1]; if (dogs == monkeys) { yield return((Modular.Factorial(dogs) * Modular.Factorial(monkeys) * new Modular(2)).Value); } else if (Math.Abs(dogs - monkeys) <= 1) { yield return((Modular.Factorial(dogs) * Modular.Factorial(monkeys)).Value); } else { yield return(0); } }
public override IEnumerable <object> Solve(TextReader inputStream) { var xy = inputStream.ReadIntArray(); var x = xy[0]; var y = xy[1]; if (2 * x < y || 2 * y < x || (x + y) % 3 != 0) { yield return(0); yield break; } var a = (2 * x - y) / 3; var b = (2 * y - x) / 3; var two = new Modular(2); yield return((Modular.Factorial(a + b) / (Modular.Factorial(a) * Modular.Factorial(b))).Value); }