玄学记录-1

发布时间 2023-07-10 18:08:20作者: georegyucjr

整个系列的前言

知周所众,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的情况下答案输出还是很正常的, 然后加上了的输出结果就很不正常了。