题解:先跟据斐波那契数列退出第一列公式,然后再根据公式推出第二列公式,最后使用矩阵快速幂得出答案即可。
#include<cstdio>
#include<cstring>
#include<cmath>
typedef long long ll;
const int N=2;
ll MOD;
struct node{
ll a[10][10];
}tmp,ans,t;
node matrix(node x,node y ){
node q;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
q.a[i][j]=0;
for(int k=1;k<=N;k++){
q.a[i][j]=(q.a[i][j]+x.a[i][k]*y.a[k][j]+MOD)%MOD;
}
}
}
return q;
}
void quick_ma(ll n){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
ans.a[i][j]=0;
}
}
for(int i=1;i<=N;i++) ans.a[i][i]=1;
t=tmp;
while(n){
if(n&1) ans=matrix(ans,t);
n>>=1;
t=matrix(t,t);
}
}
int main(){
ll c2,c1;
ll x,y;
scanf("%lld%lld%lld",&x,&y,&MOD);
c1=((ll)(x*(1+sqrt(5)))/2+x-1)%MOD;
c2=((c1*2-x+1)%MOD+MOD)%MOD;
// printf("%lld %lld\n",x,c0);
tmp.a[1][1]=1;
tmp.a[1][2]=1;
tmp.a[2][1]=1;
tmp.a[2][2]=0;
// printf("%lld %lld\n",c1,c2);
if(y>2){
quick_ma(y-2);
printf("%lld\n",(c2*ans.a[1][1]%MOD+c1*ans.a[1][2]%MOD)%MOD);
}else{
if(y==1)
printf("%lld\n",c1);
else printf("%lld\n",c2);
}
return 0;
}