题意:
求斐波那契数列的第n项(n<10^9)模p
多组样例,每一行一个样例,有两个数n和p
斐波那契有以下性质
所以原问题转变为求矩阵的n-1次幂
用快速幂求解
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
class Matrix//矩阵
{
public:
long long a,b;//第一行
long long c,d;//第二行
};
long long p;
Matrix operator*(Matrix A,Matrix B)
{
//A.a A.b * B.a B.b
//A.c A.d B.c B.d
Matrix ans;
ans.a=(A.a*B.a%p+A.b*B.c%p)%p;
ans.b=(A.a*B.b%p+A.b*B.d%p)%p;
ans.c=(A.c*B.a%p+A.d*B.c%p)%p;
ans.d=(A.c*B.b%p+A.d*B.d%p)%p;
return ans;
}
int main()
{
long long n;
while(~scanf("%lld %lld",&n,&p))
{
if(n==0)
{
printf("0\n");
continue;
}
Matrix A;
A.a=1;
A.b=1;
A.c=1;
A.d=0;
//A^(n-1)
n--;
//A^n
Matrix ans;
ans.a=1;
ans.b=0;
ans.c=0;
ans.d=1;
while (n)//快速幂的核心代码,求A^n
{
if(n&1)
{
ans=ans*A;
}
n>>=1;
A=A*A;
}
printf("%lld\n",ans.a%p);
}
return 0;
}