比赛 |
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;
}