結果
問題 | No.526 フィボナッチ数列の第N項をMで割った余りを求める |
ユーザー | bananbo |
提出日時 | 2020-05-20 11:02:24 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,490 bytes |
コンパイル時間 | 3,107 ms |
コンパイル使用メモリ | 109,252 KB |
実行使用メモリ | 27,408 KB |
最終ジャッジ日時 | 2024-10-01 23:30:16 |
合計ジャッジ時間 | 3,879 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 26 ms
27,164 KB |
testcase_01 | AC | 24 ms
24,844 KB |
testcase_02 | AC | 26 ms
25,116 KB |
testcase_03 | AC | 25 ms
25,104 KB |
testcase_04 | AC | 24 ms
25,248 KB |
testcase_05 | AC | 25 ms
23,092 KB |
testcase_06 | AC | 25 ms
25,116 KB |
testcase_07 | AC | 24 ms
24,976 KB |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | AC | 26 ms
27,272 KB |
testcase_13 | WA | - |
testcase_14 | WA | - |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections.Generic; using System.Linq; namespace YukiCoder526 { class Program { static void Main(string[] args) { var NM = ReadInt(); int N = NM[0]; int M = NM[1]; int[,] A = new int[2, 2]; A[0, 0] = 1; A[0, 1] = 1; A[1, 0] = 1; A[1, 1] = 0; A = Pow(A, N - 1, M); //DrawMapforDebug(A); Console.WriteLine(A[1, 0]); Console.ReadKey(); } /// <summary> /// 行列積 /// </summary> /// <param name="A"></param> /// <param name="B"></param> /// <param name="mod"></param> /// <returns></returns> static int[,] Multi(int[,] A, int[,] B, int mod) { int[,] R = new int[A.GetLength(0), B.GetLength(1)]; for (int i = 0; i < A.GetLength(0); i++) { for (int k = 0; k < B.GetLength(0); k++) { for (int j = 0; j < B.GetLength(1); j++) { R[i, j] = (R[i, j] + A[i, k] * B[k, j]) % mod; } } } return R; } /// <summary> /// 行列累乗 /// </summary> /// <param name="A"></param> /// <param name="n"></param> /// <param name="mod"></param> /// <returns></returns> static int[,] Pow(int[,] A, int n, int mod) { int width = A.GetLength(0); if (width != A.GetLength(1)) { Console.WriteLine("it is not square matrix."); } int[,] B = new int[width, width]; Array.Copy(A, B, A.Length); int[,] R = new int[width, width]; for (int i = 0; i < width; i++) { R[i, i] = 1; } while (n > 0) { //DrawMapforDebug(B); if ((n & 1) > 0) R = Multi(R, B, mod); B = Multi(B, B, mod); n >>= 1; } return R; } /// <summary> /// 二次元配列の可視化メソッド /// </summary> /// <param name="map"></param> static void DrawMapforDebug(int[,] map) { int W = map.GetLength(0); int H = map.GetLength(1); int[,] map2 = new int[W + 1, H + 1]; for (int i = 0; i < W + 1; i++) { for (int j = 0; j < H + 1; j++) { if (i == 0 && j == 0) map2[i, j] = 0; else if (i == 0) map2[i, j] = j - 1; else if (j == 0) map2[i, j] = i - 1; else map2[i, j] = map[i - 1, j - 1]; } } for (int i = 0; i < W + 1; i++) { for (int j = 0; j < H + 1; j++) { Console.Write(map2[i, j] % 10); } Console.WriteLine(); } Console.WriteLine(); } static int[] ReadInt() { int[] ret = Console.ReadLine().Split().Select(int.Parse).ToArray(); return ret; } static long[] ReadLong() { long[] ret = Console.ReadLine().Split().Select(long.Parse).ToArray(); return ret; } } }