Exemplo n.º 1
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var s = inputStream.ReadLine();

            var counts = new Modular[s.Length + 1, 4];

            for (int i = 0; i < counts.GetLength(0); i++)
            {
                for (int j = 0; j < counts.GetLength(1); j++)
                {
                    counts[i, j] = new Modular(0);
                }
            }

            counts[0, (int)Sequence.None] = new Modular(1);

            for (int i = 0; i < s.Length; i++)
            {
                var c = s[i];
                for (int j = 0; j < 4; j++)
                {
                    if (c == '?')
                    {
                        counts[i + 1, j] = new Modular(3) * counts[i, j];
                    }
                    else
                    {
                        counts[i + 1, j] = counts[i, j];
                    }
                }


                if (c == 'A' || c == '?')
                {
                    counts[i + 1, (int)Sequence.A] += counts[i, (int)Sequence.None];
                }

                if (c == 'B' || c == '?')
                {
                    counts[i + 1, (int)Sequence.AB] += counts[i, (int)Sequence.A];
                }

                if (c == 'C' || c == '?')
                {
                    counts[i + 1, (int)Sequence.ABC] += counts[i, (int)Sequence.AB];
                }
            }

            yield return(counts[s.Length, (int)Sequence.ABC].Value);
        }
Exemplo n.º 2
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var s = inputStream.ReadLine();

            var counts = new Modular[s.Length + 1, 3];

            for (int i = 0; i < counts.GetLength(0); i++)
            {
                for (int j = 0; j < counts.GetLength(1); j++)
                {
                    counts[i, j] = new Modular(0);
                }
            }

            var variation = new Modular(1);

            for (int i = 0; i < s.Length; i++)
            {
                var current = s[i];
                for (int j = 0; j < 3; j++)
                {
                    counts[i + 1, j] = (current == '?' ? new Modular(3) : new Modular(1)) * counts[i, j];
                }

                if (current == 'A' || current == '?')
                {
                    counts[i + 1, 0] += variation;
                }
                if (current == 'B' || current == '?')
                {
                    counts[i + 1, 1] += counts[i, 0];
                }
                if (current == 'C' || current == '?')
                {
                    counts[i + 1, 2] += counts[i, 1];
                }
                if (current == '?')
                {
                    variation *= new Modular(3);
                }
            }

            yield return(counts[s.Length, 2].Value);
        }
Exemplo n.º 3
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var l = inputStream.ReadLine();

            var count = new Modular[l.Length + 1, 2];    // 0:a+b=Lかも, 1:a+b<L

            for (int i = 0; i < count.GetLength(0); i++)
            {
                for (int j = 0; j < count.GetLength(1); j++)
                {
                    count[i, j] = new Modular(0);
                }
            }

            count[0, 0] = new Modular(1);

            for (int digit = 0; digit < l.Length; digit++)
            {
                var current = l[digit];

                // 0 -> 0
                if (current == '0')
                {
                    count[digit + 1, 0] += count[digit, 0];
                }
                else
                {
                    count[digit + 1, 0] += new Modular(2) * count[digit, 0];
                }

                // 0 -> 1
                if (current == '1')
                {
                    count[digit + 1, 1] += count[digit, 0];
                }

                // 1 -> 1
                count[digit + 1, 1] += new Modular(3) * count[digit, 1];
            }

            yield return((count[l.Length, 0] + count[l.Length, 1]).Value);
        }
Exemplo n.º 4
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var l     = inputStream.ReadLine();
            var count = new Modular[l.Length + 1, 2];   // 添え字2: 0……a+bがmax、1……←でない

            for (int i = 0; i < count.GetLength(0); i++)
            {
                for (int j = 0; j < count.GetLength(1); j++)
                {
                    count[i, j] = new Modular(0);
                }
            }

            count[0, 0] = new Modular(1);

            for (int i = 0; i < l.Length; i++)
            {
                var bit = l[i] - '0';   // 0 or 1

                if (bit == 1)
                {
                    // maxのまま(ab = 01 or 10)
                    count[i + 1, 0] += count[i, 0] * new Modular(2);

                    // maxから落ちる(00)
                    count[i + 1, 1] += count[i, 0];
                }
                else
                {
                    // maxのまま(00)
                    count[i + 1, 0] += count[i, 0];
                }

                // maxではないときは00, 01, 10から自由
                count[i + 1, 1] += count[i, 1] * new Modular(3);
            }

            yield return((count[l.Length, 0] + count[l.Length, 1]).Value);
        }
Exemplo n.º 5
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var s = inputStream.ReadLine().Reverse().ToArray();

            var mods = new Modular[s.Length + 1, 13];

            for (int i = 0; i < mods.GetLength(0); i++)
            {
                for (int j = 0; j < mods.GetLength(1); j++)
                {
                    mods[i, j] = new Modular(0);
                }
            }

            mods[0, 0] = new Modular(1);

            var tenFactor = new Modular(1, 13);

            for (int digit = 0; digit < s.Length; digit++)
            {
                var currentChar = s[digit];
                if (currentChar == '?')
                {
                    for (int currentNumber = 0; currentNumber < 10; currentNumber++)
                    {
                        UpdateNextMod(mods, tenFactor, digit, currentNumber);
                    }
                }
                else
                {
                    var currentNumber = currentChar - '0';
                    UpdateNextMod(mods, tenFactor, digit, currentNumber);
                }
                tenFactor *= new Modular(10, 13);
            }

            yield return(mods[s.Length, 5].Value);
        }
Exemplo n.º 6
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n = inputStream.ReadInt();

            var counts = new Modular[n + 1, 5, 5, 5];   // A:1, G:2, C:3, T:4

            for (int i = 0; i < counts.GetLength(0); i++)
            {
                for (int j = 0; j < counts.GetLength(1); j++)
                {
                    for (int k = 0; k < counts.GetLength(2); k++)
                    {
                        for (int l = 0; l < counts.GetLength(3); l++)
                        {
                            counts[i, j, k, l] = new Modular(0);
                        }
                    }
                }
            }

            const int NULL = 0;
            const int A    = 1;
            const int G    = 2;
            const int C    = 3;
            const int T    = 4;

            counts[0, NULL, NULL, NULL] = new Modular(1);

            for (int cursor = 0; cursor < n; cursor++)
            {
                for (int before3 = NULL; before3 <= T; before3++)
                {
                    for (int before2 = NULL; before2 <= T; before2++)
                    {
                        for (int before1 = NULL; before1 <= T; before1++)
                        {
                            for (int current = A; current <= T; current++)
                            {
                                var isNG = (before2 == A && before1 == G && current == C) ||
                                           (before2 == G && before1 == A && current == C) ||
                                           (before2 == A && before1 == C && current == G) ||
                                           (before3 == A && before2 == G && current == C) ||
                                           (before3 == A && before1 == G && current == C);

                                if (!isNG)
                                {
                                    counts[cursor + 1, before2, before1, current] += counts[cursor, before3, before2, before1];
                                }
                            }
                        }
                    }
                }
            }

            var total = new Modular(0);

            for (int before3 = NULL; before3 <= T; before3++)
            {
                for (int before2 = NULL; before2 <= T; before2++)
                {
                    for (int before1 = NULL; before1 <= T; before1++)
                    {
                        total += counts[n, before3, before2, before1];
                    }
                }
            }

            yield return(total.Value);
        }