public void Solve() { var a = sc.Long(); var b = sc.Long(); ModInteger.Mod = sc.Integer(); var mat = new ModMatrix(2, 2); mat[0, 0] = 10; mat[0, 1] = 1; mat[1, 1] = 1; var vec = new ModMatrix(2, 1); vec[0, 0] = 1; vec[0, 1] = 1; var gcd = MathEx.GCD(a, b); var A = (ModMatrix.Pow(mat, a - 1) * vec)[0, 0]; mat[0, 0] = ModInteger.Pow(10, gcd); var B = (ModMatrix.Pow(mat, b / gcd - 1) * vec)[0, 0]; IO.Printer.Out.WriteLine(A * B); //IO.Printer.Out.WriteLine(A * B * ModInteger.Inverse(GCD)); }
public override IEnumerable <object> Solve(TextReader inputStream) { var(n, k) = inputStream.ReadValue <int, long>(); var initialVector = new ModVector(Enumerable.Repeat(Modular.One, n).ToArray()); var matrix = new ModMatrix(n); for (int i = 0; i < n; i++) { var a = inputStream.ReadIntArray(); for (int j = 0; j < n; j++) { matrix[i, j] = a[j]; } } var resultVector = matrix.Pow(k) * initialVector; var result = Modular.Zero; for (int i = 0; i < resultVector.Length; i++) { result += resultVector[i]; } yield return(result); }