6.12 考试 + 总结
T1 celebration
-
题目大意 把n分成每个大小不同的正整数的方案数,有序
-
我们可以先求出无序的数量,再乘一下阶乘就可以了
#define MAXN 100010UL
#include <cstdio>
#define Mod 998244353
using namespace std;
int n, m, f[2][MAXN][2];
int main() {
freopen("celebration.in", "r", stdin);
freopen("celebration.out", "w", stdout);
scanf("%d%d", &n, &m);
if(1ll*m*(m+1)>2*n) {
printf("0");
return 0;
}
int lt = 1, nw = 0;
f[0][0][0] = 1;
for(int i = 1 ; i <= m ; ++ i) {
lt ^= 1, nw ^= 1;
int l = (i*(i+1))/2;
for(int j = 0 ; j < l && j <= n ; ++ j) f[nw][j][0] = f[nw][j][1] = 0;
for(int j = l ; j <= n ; ++ j) {
f[nw][j][0] = f[nw][j-i][0]+f[nw][j-i][1];
if(f[nw][j][0]>=Mod) f[nw][j][0] -= Mod;
f[nw][j][1] = f[lt][j-1][0];
}
}
int ans = f[nw][n][0]+f[nw][n][1];
if(ans>=Mod) ans -= Mod;
for(int i = 1 ; i <= m ; ++ i) ans = 1ll*ans*i%Mod;
printf("%d", ans);
return 0;
}