// Problem: P7961 [NOIP2021] 数列【民间数据】 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P7961 // Memory Limit: 512 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define mo 998244353 #define N 40 #define M 110 int n, m, i, j, k; int c[M][M], s[M][M]; int f[M][N][N][N], v[M], K;
int count(int x) { int ans=0; while(x) x-=x&-x, ++ans; return ans; }
int dfs(int k, int u, int x, int y) { if(u==n) { // printf("> f[%lld][%lld][%lld][%lld]=%lld\n", k, u, x, y, x+count(y)<=K); if(x+count(y)>K) return 0; // printf("----------"); return 1; } if(k>m) return 0; if(f[k][u][x][y]!=-1) return f[k][u][x][y]; int ans=0; for(int i=0; i<=n-u; ++i) { ans=(ans+dfs(k+1, u+i, x+((y+i)&1), (y+i)>>1) *s[k][i]%mo*c[u+i][i]%mo)%mo; // printf("%lld %lld\n", s[k][i], c[n-u][i]); } f[k][u][x][y]=ans; // printf("f[%lld][%lld][%lld][%lld]=%lld\n", k, u, x, y, f[k][u][x][y]); return f[k][u][x][y]; }