結果
| 問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-05-01 17:24:20 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 13 ms / 2,000 ms |
| コード長 | 1,249 bytes |
| コンパイル時間 | 2,066 ms |
| コンパイル使用メモリ | 206,292 KB |
| 最終ジャッジ日時 | 2025-01-21 05:21:47 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include<bits/stdc++.h>
std::vector<std::vector<int64_t>> matrix_product(std::vector<std::vector<int64_t>> A,std::vector<std::vector<int64_t>>B,const int64_t mod)
{
int64_t AH=A.size(),AW=A[0].size(),BH=B.size(),BW=B[0].size();
assert(AW==BH);
std::vector<std::vector<int64_t>> C(AH,std::vector<int64_t> (BW));
for(int i=0;i<AH;i++)
{
for(int j=0;j<BW;j++)
{
for(int k=0;k<AH;k++)
{
C[i][j]+=A[i][k]*B[k][j];
}
C[i][j]%=mod;
}
}
return C;
}
int64_t pow_mod(int64_t a,int64_t n,int64_t mod)
{
assert(0<=n);
int64_t res=1;
while(0<n)
{
if(0<(n&1))
{
res=res*a%mod;
}
a=a*a%mod;
n=n>>1;
}
return res;
}
int64_t fibonacci(int64_t N,const int64_t mod)
{
if(N==0)
{
return 0;
}
N--;
std::vector<std::vector<int64_t>> F(2,std::vector<int64_t> (1)),A(2,std::vector<int64_t> (2)),B;
F[0][0]=1,F[1][0]=0;
A[0][0]=1,A[0][1]=1,A[1][0]=1,A[1][1]=0;
B=A;
while(0<N)
{
if((N&1))
{
A=matrix_product(A,B,mod);
}
B=matrix_product(B,B,mod);
N>>=1;
}
return matrix_product(A,F,mod)[1][0];
}
int main()
{
int64_t N,M;
std::cin>>N>>M;
N--;
std::cout<<fibonacci(N,M)<<std::endl;
}