JZOJ-senior-4627. 【NOIP2016提高A組模擬7.15】斐波那契數列
阿新 • • 發佈:2018-12-16
Time Limits: 1000 ms Memory Limits: 524288 KB
Description
Input
Output
Sample Input
5 10
Sample Output
8
Data Constraint
Solution
數列的遞推公式為: 用矩陣可以這麼表示:
於是我們採用矩陣乘法 順利解決此題
Code
#include<algorithm>
#include<cstring>
#include<cstdio>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const int N=2;
ll n,P;
struct matrix
{
ll a[N][N];
}A,Ans;
matrix mul(matrix A,matrix B)
{
matrix C;
memset(C.a,0,sizeof(C.a));
fo(k,0,1)
fo(i,0,1) if(A.a[i][k])
fo(j,0,1) if(B.a[k][j])
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j]%P)%P;
return C;
}
matrix ksm(matrix A,ll k)
{
matrix S;
fo(i,0,1) fo(j,0,1) S.a[i][j]=(i==j);
for(;k;A=mul(A,A),k>>=1)
if(k&1) S=mul(S,A);
return S;
}
int main()
{
scanf("%lld%lld",&n,&P);
A.a[0][0]=A.a[0][1]=A.a[1][0]=1,A.a[1][1]=0;
Ans=ksm(A,n-1);
printf("%lld",(Ans.a[0][0]+Ans.a[0][1])%P);
}