用 fib(n)fib(n) 表示斐波那契数列的第 nn项,现在要求你求 fib(n)fib(n) mod mm。fib(1)=1,fib(2)=1fib(1)=1,fib(2)=1。
输入格式
输入 22 个整数 n(1 \le n \le 10^{18})n(1≤n≤1018),m(2 \le m \le 100000000)m(2≤m≤100000000)。
输出格式
输出 fib(n)fib(n) 对 mm 取模的值。
样例输入1
4 10
样例输出1
3
样例输入2
100000000 100000000
样例输出2
60546875
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct matrix{
ll a[105][105];
};
matrix matrix_mul(matrix A,matrix B, ll mod)//矩阵A乘B
{
matrix C;
int i,j,k;
for(i=0;i<=1;i++)
{
for(j=0;j<=1;j++)
{
C.a[i][j]=0;
for(k=0;k<=1;k++)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j]%mod;
C.a[i][j]%=mod;
}
}
}
return C;
}
matrix unit()//单位矩阵
{
matrix res;
int i,j;
for(i=0;i<=1;i++)
{
for(j=0;j<=1;j++)
{
if(i==j)
res.a[i][j]=1;
else
res.a[i][j]=0;
}
}
return res;
}
matrix matrix_pow(matrix A,ll n,ll mod)//矩阵快速幂
{
matrix res=unit(),temp=A;
for(;n;n/=2)
{
if(n&1)
res=matrix_mul(res,temp,mod);
temp=matrix_mul(temp,temp,mod);
}
return res;
}
int main()
{
ll n,m;
cin>>n>>m;
if(n<3)
printf("1\n");
else
{
//int a[2][2]={1,1,1,0},b[2][1]={1,1};
matrix A,B;
A.a[0][0]=1;//转移矩阵
A.a[0][1]=1;
A.a[1][0]=1;
A.a[1][1]=0;
B.a[0][0]=1;
B.a[1][0]=1;
matrix c;
c=matrix_mul(matrix_pow(A,n-2,m),B,m);
c=matrix_mul(c,unit(),m);
printf("%lld\n",c.a[0][0]);
}
}