涛哥说你打代码原来有注释吗?
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
#define int long long
#define ll long long
using namespace std;
const int N=45,mod=998244353;
ll n,K,p,F[N][N][N],G[N][N][N][N],S[N],I[N];
inline void A(ll &x,ll y){x+=y;if(x>=mod) x-=mod;}
inline ll ksm(ll a,int b=mod-2)
{ll ans=1;for(;b;b>>=1,a=a*a%mod)if(b&1) ans=ans*a%mod;return ans;
}
signed main()
{freopen("dia.in","r",stdin);freopen("dia.out","w",stdout);cin>>n>>K>>p,F[1][1][1]=1;for(int i=1;i<=n;++i) I[i]=ksm(i);for(int d=2;d<=K/2+1;++d)//枚举深度{ll f[N][N][N];memset(f,0,sizeof(f));f[0][1][0]=1;for(int k=1;k<n;++k)//枚举转移大小 (限制最大深度 d-2){for(int c=1;c<=min(n/k,S[k]);++c)//枚举同一大小选几种{for(int x=1;x<=n/k;++x)//枚举这一种选几个{for(int s=n;s>=x*k;--s)//枚举现在大小{A(f[c][s][0],f[c-1][s-x*k][0]*(S[k]-c+1)%mod*I[c]%mod);}} }for(int c=1;c<=min(n/k,S[k]);++c) for(int s=1;s<=n;++s)A(f[0][s][0],f[c][s][0]),f[c][s][0]=0;}if(d==K/2+1&&(K&1^1)){for(int s=0;s<=n;++s) G[0][s][0][0]=f[0][s][0];break;}for(int k=d-1;k<n;++k)//枚举转移大小(限制深度为 d-1){for(int y=1;y<=k;++y)//枚举关键叶子个数{for(int c=1;c<=min(n/k,F[d-1][k][y]);++c)//枚举同一大小同一关键叶子个数选几种{for(int x=1;x<=n/k;++x)//枚举这一种选几个{for(int s=n;s>=x*k;--s)//枚举现在大小{for(int z=s;z>=x*y;--z)//枚举现在关键叶子个数{A(f[c][s][z],f[c-1][s-x*k][z-x*y]*(F[d-1][k][y]-c+1)%mod*I[c]%mod);}}}}for(int c=1;c<=min(n/k,F[d-1][k][y]);++c) for(int s=1;s<=n;++s) for(int z=1;z<=s;++z)A(f[0][s][z],f[c][s][z]),f[c][s][z]=0;}}for(int s=1;s<=n;++s) for(int z=1;z<=s;++z) F[d][s][z]=f[0][s][z];for(int s=1;s<=n;++s) for(int z=1;z<=s;++z) A(S[s],F[d-1][s][z]);}int d=K/2+1;if(K&1){ll ans=0;for(int k1=1;k1<=n;++k1){for(int y1=1;y1<=k1;++y1){if(p%y1) continue;int k2=n-k1,y2=p/y1;if(k2<k1||(k2==k1&&y2<y1)) continue;ans+=F[d][k1][y1]*F[d][k2][y2]%mod*I[1+(k1==k2&&y1==y2)]%mod;}}cout<<ans%mod<<'\n';return 0;}for(int k=d-1;k<n;++k)//枚举转移大小(限制深度为 d-1){for(int y=1;y<=k;++y)//枚举关键叶子个数{for(int c=1;c<=min(n/k,F[d-1][k][y]);++c)//枚举同一大小同一关键叶子个数选几种{for(int x=1;x<=n/k;++x)//枚举这一种选几个{for(int s=n;s>=x*k;--s)//枚举现在大小{for(int z=s-x*y;z>=0;--z)//枚举转移前关键叶子个数{for(int a=p-(z*x*y+(y*y*x*(x-1)/2));a>=0;--a)//枚举转移前直径个数{A(G[c][s][z+x*y][a+z*x*y+(y*y*x*(x-1)/2)],G[c-1][s-x*k][z][a]*(F[d-1][k][y]-c+1)%mod*I[c]%mod);}}}}}for(int c=1;c<=min(n/k,F[d-1][k][y]);++c) for(int s=1;s<=n;++s) for(int z=1;z<=s;++z) for(int a=0;a<=p;++a)A(G[0][s][z][a],G[c][s][z][a]),G[c][s][z][a]=0;}}ll ans=0;for(int i=1;i<=n;++i) ans+=G[0][n][i][p];cout<<ans%mod<<'\n';return 0;
}