Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
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);
        }