結果
| 問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-25 12:12:44 |
| 言語 | C# (.NET 8.0.404) |
| 結果 |
AC
|
| 実行時間 | 49 ms / 2,000 ms |
| コード長 | 1,679 bytes |
| コンパイル時間 | 10,475 ms |
| コンパイル使用メモリ | 169,640 KB |
| 実行使用メモリ | 185,808 KB |
| 最終ジャッジ日時 | 2024-07-03 11:59:32 |
| 合計ジャッジ時間 | 11,990 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (93 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Numerics;
using System.Linq.Expressions;
using System.Linq;
using System.Diagnostics;
public class Csharp_Work
{
static long m;
static long[, ] Mul(long[, ] a, long[, ] b)
{
var res = new long[a.GetLength(0), b.GetLength(1)];
for(int i = 0; i < a.GetLength(0); ++i) {
for(int j = 0; j < b.GetLength(1); ++j) {
for(int k = 0; k < a.GetLength(1); ++k) {
res[i, j] += a[i, k] * b[k, j];
res[i, j] %= m;
}
}
}
return res;
}
// 正方行列の累乗
static long[, ] Pow(long[, ] a, long n)
{
long lng = a.GetLength(0);
var res = new long[lng, lng];
var a_tmp = a.Clone() as long[, ];
// 単位行列
for(int i = 0; i < lng; ++i) {
res[i, i] = 1;
}
long num = n;
while(num > 0) {
if((num & 1) != 0) {
res = Mul(res, a_tmp);
num -= 1;
continue;
}
a_tmp = Mul(a_tmp, a_tmp);
num >>= 1;
}
return res;
}
static void Main(string[] args)
{
var fibo = new long[2, 2];
fibo[0, 0] = 1;
fibo[0, 1] = 1;
fibo[1, 0] = 1;
fibo[1, 1] = 0;
var tmp = Console.ReadLine().Split();
long n = long.Parse(tmp[0]);
m = long.Parse(tmp[1]);
var res = Pow(fibo, n - 2);
Console.WriteLine(res[0, 0]);
}
}