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