1 条题解
-
0
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
- 上传者