题目描述
输入
输入n,m。
输出
样例输入 复制
5 1000
样例输出 复制
5
数据范围限制
这题的代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
struct node
{
ll a[101][101];
}p,g;
void init(node &x)
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
{
if(i==j)
x.a[i][j]=1;
else
x.a[i][j]=0;
}
}
void mul(node &x,node &y,node &t)
{
memset(t.a,0,sizeof(t.a));
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
{
t.a[i][j]+=x.a[i][k]*y.a[k][j];
t.a[i][j]%=m;
}
}
void ksm(int k)
{
init(g);
node t,ff=p;
while(k)
{
if(k%2)
mul(g,ff,t),g=t;
mul(ff,ff,t),ff=t;
k/=2;
}
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
p.a[1][1]=1;
p.a[1][2]=1;
p.a[2][1]=1;
p.a[2][2]=0;
if(n<=2)
printf("1\n");
else
{
ksm(n-2);
ll ans=(g.a[1][1]%m+(g.a[1][2]%m))%m;
printf("%lld",ans);
}
}