整个系列的前言
知周所众,OI是一门玄学(逃)。我指会出现玄学的问题。因此这个系列来记录一些我觉得很玄学、很解释不清楚的东西。如果你会,你可以认为我很菜,并且给出玄学的解释。如果你想你不会,你就可以想象成你是欧皇,没有碰到过这种情况。如果你也碰到过,那么很好,这件事情就足以称为“泰裤辣”
0708模拟赛的玄学记录
题目: 就是加了多组数据、取模、加大数据范围的SGU221
原题面:
国际象棋中象可以沿着对角线方向前进,并且吃掉沿途经过的棋子。
现在给定一个\(n \times n\) 的棋盘,您需要在上面摆放国际象棋中的象,使得它们互相攻击不到,分别求出
摆放 个的方案数对 \(998244353\) 取模的值。
输入格式
第一行一个数\(T\),表示数据组数。
接下来 \(T\)行,每行两个数 \(n, k\)。
输出格式
对于每组数据,输出一行 \(k\)个数,分别表示摆放 \(1~k\)个的答案。
样例组
样例输入
3
2 2
3 2
4 3
样例输出
4 4
9 26
16 92 232
数据范围是\(T \leq 10, n \leq 7 \times 10^4, k \leq 10^3\)
然后我的代码是这样的:
#include <bits/stdc++.h>
using namespace std;
#define N 70005
#define K 1005
#define ll long long
ll dp[2][N][K];
int tol, tem[N];
void make(int x) {
tol = 0;
for (int t = x; t <= N - 5; t += 2) {
tem[++tol] = t;
if (t != N - 5)
tem[++tol] = t;
}
dp[x - 1][0][0] = 1;
for (int i = 1; i <= tol; ++i)
for (int j = 0; j <= K - 5; ++j)
if (tem[i] >= j)
dp[x - 1][i][j] = dp[x - 1][i - 1][j] + dp[x - 1][i - 1][j - 1] * (tem[i] - j + 1);
}
signed main() {
make(1), make(2);
int T;
scanf("%d", &T);
while (T--) {
int n, k;
scanf("%d%d", &n, &k);
ll ans = 0;
for (int _ = 1; _ <= k; ++_) {
ans = 0;
for (int i = 0; i <= _; ++i)
ans += dp[1][n - 1][i] * dp[0][2 * n - 1 - (n - 1)][_ - i];
printf("%lld ", ans);
}
puts("");
}
}
然后我在这个代码上加上了inline
(在函数void make()
前面), 那一行变成:
inline void make(int x) {
// 里面的内容
}
然后在不加inline
的情况下答案输出还是很正常的, 然后加上了的输出结果就很不正常了。