记录编号 577252 评测结果 AAAAAAAAAA
题目名称 [AHOI 2004] 数字迷阵 最终得分 100
用户昵称 Gravatarop_组撒头屯 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-10-28 22:51:25 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3000+5;
ll x,y,mod;
ll f[N];
int cnt=3,p[N],d=0;
struct sdf{
	ll m[5][5];
	sdf operator*(const sdf&x)const{
		sdf tmp;
		tmp.m[1][1]=tmp.m[1][2]=tmp.m[2][1]=tmp.m[2][2]=0;
		for (int i=1;i<=2;i++){
			for (int j=1;j<=2;j++){
				for (int k=1;k<=2;k++)tmp.m[i][j]=(tmp.m[i][j]+m[i][k]*x.m[k][j]%mod)%mod;
			}
		}
		return tmp;
	}
}g,q;
void fst(ll x){
	if (x==1)return ;
	if (x&1){
		fst(x-1);g=g*q;
	}
	else{
		fst(x/2);g=g*g;
	}
	return ;
}
ll fib(ll k){
	if (k==1)return 1;
	g=q;
	fst(k-1);
	return (g.m[1][1]+g.m[2][1])%mod;
}
int main(){
	freopen ("nummaze.in","r",stdin);
	freopen ("nummaze.out","w",stdout);
	scanf("%lld%lld%lld",&x,&y,&mod);
	q.m[1][1]=q.m[1][2]=q.m[2][1]=1;
	f[1]=1;f[2]=2;
	for (;;cnt++){
		f[cnt]=f[cnt-1]+f[cnt-2];
		if (f[cnt]>=x)break;
	}
	ll t=x-1,ans=fib(y)%mod;
	for (int i=cnt;i>=1;i--){
		if (f[i]<=t){
			t-=f[i];ans=(ans+fib(y+i+1))%mod;
		}
	}
	printf("%lld\n",ans%mod);
	return 0;
}