1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n, m, t; LL P; struct node { LL a[110][110]; node(){memset(a,0,sizeof(a));} }; node operator* (node A, node B) { node C; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%P; return C; } node qpow(node A, int b) { node C;for(int i=1;i<=n;i++)C.a[i][i]=1; for(;b;b>>=1) { if(b&1)C=C*A; A=A*A; } return C; } node f[21]; int main() { scanf("%d%d%d%lld", &n, &m, &t, &P); node A, E; for(int i=1;i<=n;i++)A.a[1][i]=1; E.a[i][i]=1; for(int i=1;i<=m;i++) { int x, y; char s[11]; scanf("%s%d%d", s, &x, &y); if(s[0]=='d')memcpy(f[i].a, E.a, sizeof(E.a)), f[i].a[x][x]=0; if(s[0]=='r')f[i]=E, f[i].a[x][x]=y; if(s[0]=='c')f[i]=E, f[i].a[y][x]=1; if(s[0]=='t')f[i]=E, f[i].a[y][x]=1, f[i].a[y][y]=0; if(s[0]=='s') { f[i]=E; f[i].a[x][x]=0;f[i].a[y][y]=0; f[i].a[x][y]=1;f[i].a[y][x]=1; } if(s[0]=='m') { f[i]=E; f[i].a[n][1]=1; for(int j=2;j<=n;j++)f[i].a[j-1][j]=1; } } node ff=E; for(int i=1;i<=m;i++)ff=ff*f[i]; A=A*qpow(ff, t/m); for(int i=1;i<=t%m;i++)A=A*f[i]; for(int i=1;i<=n;i++)printf("%lld ", A.a[1][i]); return 0; }
- 1
信息
- ID
- 599
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 28
- 已通过
- 13
- 上传者