1 条题解

  • 0
    @ 2022-12-31 16:05:49

    C++ :

    #include<bits/stdc++.h>
    #define int long long
    #define rep(i,j,k) for(int i=j;i<=k;i++)
    #define per(i,j,k) for(int i=j;i>=k;i--)
    using namespace std;
    inline int read(){
    	char ch=getchar();
    	int x=0,t=1;
    	while((ch<'0'||ch>'9')&&ch!='-'){ch=getchar();}
    	if(ch=='-'){t=-1,ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48),ch=getchar();}
    	return x*t;
    }
    const int N=55,mod=1e9+7;
    int f[N][N][N*N];//最后一维表示把现在未配对的都假设配在目前的第i位的花费
    int n,kk;
    signed main(){
    	n=read(),kk=read();
    	f[0][0][0]=1;
    	rep(i,1,n){
    		rep(j,0,i){
    			rep(k,0,kk){
    				if(j-1>=0&&k-2*(j-1)>=0){
    					f[i][j][k]+=f[i-1][j-1][k-2*(j-1)];
    				}
    				if(k-2*j>=0){
    					f[i][j][k]+=f[i-1][j][k-2*j]*(2*j+1);
    				}
    				if(k-2*(j+1)>=0){
    					f[i][j][k]+=f[i-1][j+1][k-2*(j+1)]*(j+1)*(j+1);
    				}
    				f[i][j][k]%=mod;
    			}
    		}
    	}
    	cout<<f[n][0][kk]<<endl;
    	return 0;
    }
    

    Python :

    # coding=utf-8
    mod = 10 ** 9 + 7
    
    n, K = map(int, input().split())
    dp = [[0] * (K + 1) for j in range(n)]
    dp[0][0] = 1
    for i in range(n):
        ndp = [[0] * (K + 1) for j in range(n)]
        for j in range(i + 1):
            for k in range(K + 1):
                dpi = dp[j][k]
                if dpi == 0:
                    continue
                for nj, co in [(j - 1, j * j), (j, 1 + j * 2), (j + 1, 1)]:
                    nk = k + nj * 2
                    if 0 <= nj < n and nk <= K:
                        ndp[nj][nk] += dpi * co
                        ndp[nj][nk] %= mod
        dp = ndp
    ans = dp[0][K]
    print(ans)
    
    
    

    信息

    ID
    20991
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    6
    已通过
    2
    上传者