1 条题解

  • 0
    @ 2026-7-4 18:09:16

    #include <cstdio>
    #include <iostream>
    using namespace std;
    #define int long long
    const int M = 105;
    int read()
    {
        int x=0,f=1;char c;
        while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
        while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
        return x*f;
    }
    int n,m,k,p,C[M][M],g[M][M][M][2],f[M][M][M][2];
    int sub(int a,int b) {return (a-b+p)%p;}
    void add(int &x,int y) {x=(x+y)%p;}
    int qkpow(int a,int b)
    {
        int r=1;
        while(b>0)
        {
            if(b&1) r=r*a%p;
            a=a*a%p;
            b>>=1;
        }
        return r;
    }
    signed main()
    {
        n=read();m=read();k=read();p=read();
        for(int i=0;i<=max(n,m);i++)
        {
        	C[i][0]=1;
        	for(int j=1;j<=i;j++)
        		C[i][j]=(C[i-1][j-1]+C[i-1][j])%p;
    	}
        for(int c=1;c<=k;c++) for(int i=0;i<=m;i++)
        {
            int t=qkpow(k-c+1,i)*sub(qkpow(c,m-i)
                ,qkpow(c-1,m-i))%p;
            g[c][i][0][0]=1;
            for(int j=1;j<=n;j++)
                g[c][i][j][0]=g[c][i][j-1][0]*t%p;
        }
        for(int c=1;c<=k;c++) for(int i=0;i<=n;i++)
        {
            int t=qkpow(c,n-i)*sub(qkpow(k-c+1,i)
                ,qkpow(k-c,i))%p;
            g[c][i][0][1]=1;
            for(int j=1;j<=m;j++)
                g[c][i][j][1]=g[c][i][j-1][1]*t%p;
        }
        f[1][0][0][0]=1;
        for(int c=1;c<=k;c++) for(int i=0;i<=n;i++)
            for(int j=0;j<=m;j++)
            {
                for(int l=0;l<=n-i;l++)
                    add(f[c][i+l][j][1],f[c][i][j][0]*
    				C[n-i][l]%p*g[c][j][l][0]);
                for(int l=0;l<=m-j;l++)
                    add(f[c+1][i][j+l][0],f[c][i][j][1]*
    				C[m-j][l]%p*g[c][i][l][1]);
            }
        printf("%lld\n",f[k+1][n][m][0]);
    }
    
    
    • 1

    信息

    ID
    8488
    时间
    6000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者