\begin{aligned}
(x+1)^{n-1} &= \sum_{i \ge 0} \binom{n-1}{i}x^i\\
\dfrac{1}{(1-x^3)^{n-1}} &= \sum_{i \ge 0} \binom{i+n-2}{n-2}(x^3)^i
\end{aligned}
~~感觉这个式子找不出什么组合意义。~~
题外话:使用线性递推可以做到 $O(n \log n \log m)$,$n$ 开到 $10^5$ 级别,此时 $m$ 可以开到 $10^{18}$。
代码:
```cpp
#include <bits/stdc++.h>
#define lowbit(x) (x & -x)
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
const int V = 1e7+5;
const int Mod = 998244353;
int n, m, ans;
ll fac[V], finv[V], F[V];
inline int qpow(int a, int b) {
ll base = a, ans = 1;
while (b) {
if (b & 1) ans = ans * base % Mod;
base = base * base % Mod;
b >>= 1;
}
return ans;
}
inline void Add(int &a, int b) { a += b; if (a >= Mod) a -= Mod; }
inline ll C(int n, int m) {
if (m > n) return 0;
return fac[n] * finv[m] % Mod * finv[n - m] % Mod;
}
int main() {
fac[0] = 1;
for (int i = 1; i < V; i++) fac[i] = fac[i - 1] * i % Mod;
finv[V - 1] = qpow(fac[V - 1], Mod - 2);
for (int i = V - 1; i; i--) finv[i - 1] = finv[i] * i % Mod;
scanf("%d%d", &n, &m);
F[0] = 1;
for (int i = 1; i <= m - n + 1; i++) F[i] = (F[i - 1] + C(n - 1, i)) % Mod;
for (int i = 1; i <= m - n + 1; i++) F[i] = (F[i - 1] + F[i]) % Mod;
for (int i = 0; i <= m - n + 1; i += 3) Add(ans, C(i / 3 + n - 2, n - 2) * F[m - n + 1 - i] % Mod);
printf("%d", ans);
return 0;
}
```