1 条题解

  • 0
    @ 2025-10-8 16:52:32
    #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
    上传者