比赛 4043级NOIP2022欢乐赛1st 评测结果 WAWWWWWWWW
题目名称 数字迷阵 最终得分 10
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-10-28 22:06:24
显示代码纯文本
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll x,y,Mod;
ll a[4],b[4][4],t[4][4],s[7]={0,3,2,3,3,2};
void poww(int c)
{
	while(c)
	{
		for(int i=1;i<=2;++i)
			for(int j=1;j<=2;++j)
				t[i][j]=b[i][j],b[i][j]=0;
		if(c&1)
		{
			ll i=(a[1]*t[1][1])%Mod+(a[2]*t[2][1])%Mod,j=(a[1]*t[1][2])%Mod+(a[2]*t[2][2])%Mod;
			i%=Mod,j%=Mod;
			a[1]=i,a[2]=j;
		}
		for(int i=1;i<=2;++i)
			for(int j=1;j<=2;++j)
				for(int k=1;k<=2;++k)
					b[i][j]+=t[i][k]*t[k][j]%Mod,b[i][j]%=Mod;
		c>>=1;
	}
	return ;
}
int main()
{
	freopen("nummaze.in","r",stdin);
	freopen("nummaze.out","w",stdout);
	scanf("%lld%lld%lld",&x,&y,&Mod);
	a[1]=1;
	a[2]=2;
	b[1][1]=0;
	b[1][2]=b[2][1]=b[2][2]=1;
	poww(y-1);
	a[3]=(a[1]+a[2])%Mod;
	ll tot=a[2]*2%Mod+a[3]*3%Mod;
	tot%=Mod;
	--x;
	ll add=1ll*((x/5)%Mod)*tot%Mod;
	x%=5;
	for(int i=1;i<=x;++i)
	{
		add+=a[s[i]];
		add%=Mod; 
	}
	add+=a[1];
	add%=Mod;
	printf("%lld\n",add);
	return 0;
 }