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); }
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); }
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); }
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); }
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); }
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); }