我常常追忆过去

我常常追忆过去。
——联合省选2025 追忆


题意

请以《我常常追忆过去》为题写一篇文章,字数不限,文体不限。

思路

我常常追忆过去。

生命瞬间定格在脑海。我将背后的时间裁剪、折叠、蜷曲,揉捻成天上朵朵白云。

云朵之间亦有分别:积云厚重,而卷云飘渺。生命里震撼的场景掠过我的思绪便一生无法忘怀,而更为普通平常的记忆在时间的冲刷下只留下些许残骸。追忆宛如入梦,太过清楚则无法愉悦自己的幻想,过分模糊却又坠入虚无。只有薄雾间的山水,面纱下的女子,那恰到好处的朦胧,才能满足我对美的苛求。

追忆总在不经意间将我裹进泛黄的纸页里。分别又重聚的朋友,推倒又重建的街道,种种线索协助着我从一个具体的时刻出发沿时间的河逆流而上。曾经的日子无法重来,我只不过是一个过客。但我仍然渴望在每一次追忆之旅中留下闲暇时间,在一个场景前驻足,在岁月的朦胧里瞭望过去的自己,感受尽可能多的甜蜜。美好的时光曾流过我的身体,我便心满意足。

过去已经凝固,我带着回忆向前,只是时常疏于保管,回忆也在改变着各自的形态。这给我的追忆旅程带来些许挑战。

我该在哪里停留?我问我自己。

我常常追忆过去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <bits/stdc++.h>
using namespace std;

const int N = 2e6 + 5;
const int mod = 998244353;

namespace NTT {
const long long g = 3;
const long long p = ::mod;
long long wn[35];
long long inv[N];

long long power(long long a, long long b = p - 2) {
long long res = 1;
while (b) {
if (b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}

int _ = [] {
for (int i = 0; i < 35; i++) wn[i] = power(g, (p - 1) / (1ll << i));
inv[0] = inv[1] = 1;
for (long long i = 2; i < N; i++) inv[i] = ((p - p / i) * inv[p % i]) % p;
return 0;
}();

void ntt(long long *a, int len, int flag) {
long long i, j = 0, t, k, w, id;
for (i = 1; i < len - 1; i++) {
for (t = len; j ^= t >>= 1, ~j & t;);
if (i < j) swap(a[i], a[j]);
}
for (i = 1, id = 1; i < len; i <<= 1, id++) {
t = i << 1;
for (j = 0; j < len; j += t) {
for (k = 0, w = 1; k < i; k++, w = w * wn[id] % p) {
long long x = a[j + k], y = w * a[j + k + i] % p;
a[j + k] = (x + y) % p;
a[j + k + i] = (x - y + p) % p;
}
}
}
if (!flag) {
for (i = 1, j = len - 1; i < j; i++, j--) swap(a[i], a[j]);
long long in = power(len);
for (i = 0; i < len; i++) a[i] = a[i] * in % p;
}
}

void mul(vector<long long> &a, vector<long long> &b) {
int l1 = a.size(), l2 = b.size();
int len, i;
for (len = 1; len <= l1 + l2; len <<= 1);
static long long A[N << 3], B[N << 3];
a.resize(len, 0);
b.resize(len, 0);
for (i = 0; i < len; i++) A[i] = a[i];
for (i = 0; i < len; i++) B[i] = b[i];
ntt(A, len, 1);
ntt(B, len, 1);
for (i = 0; i < len; i++) A[i] = A[i] * B[i] % p;
ntt(A, len, 0);
for (i = 0; i < len; i++) a[i] = A[i];
a.resize(l1 + l2);
b.resize(l2, 0);
}

void invp(long long *a, int n) {
static long long w[N << 1], r[N << 1], sav[N << 1];
int len, k, i;
for (len = 1; len < n; len <<= 1);
w[0] = power(a[0]);
for (k = 2; k <= len; k <<= 1) {
for (i = 0; i < (k >> 1); i++) r[i] = w[i];
for (i = 0; i < k; i++) sav[i] = a[i];
ntt(sav, k, 1);
ntt(r, k, 1);
for (i = 0; i < k; i++) r[i] = r[i] * sav[i] % p;
ntt(r, k, 0);
memset(r, 0, sizeof(long long) * (k >> 1));
for (i = 0; i < k; i++) sav[i] = w[i];
ntt(sav, k, 1);
ntt(r, k, 1);
for (i = 0; i < k; i++) r[i] = r[i] * sav[i] % p;
ntt(r, k, 0);
for (i = k >> 1; i < k; i++) w[i] = (w[i] * 2 - r[i] + p) % p;
}
for (i = 0; i < n; i++) a[i] = w[i];
memset(w, 0, sizeof(long long) * len);
memset(r, 0, sizeof(long long) * len);
memset(sav, 0, sizeof(long long) * len);
}

void invp(vector<long long> &a, int n) {
static long long f[N << 1];
if (a.size() < n) a.resize(n, 0);
for (int i = 0; i < n; i++) f[i] = a[i];
invp(f, n);
for (int i = 0; i < n; i++) a[i] = f[i];
a.resize(n);
memset(f, 0, sizeof(long long) * n);
}

void deriv(vector<long long> &a) {
if (a.empty()) return;
for (int i = 1; i < a.size(); i++) a[i - 1] = a[i] * i % p;
a.pop_back();
}

void integ(vector<long long> &a) {
a.push_back(0);
for (int i = (int)a.size() - 1; i > 0; i--) a[i] = a[i - 1] * inv[i] % p;
a[0] = 0;
}

void sqrtp(vector<long long> &a, int n) {
int len, k, i;
for (len = 1; len < n; len <<= 1);
static long long b1[N << 2], b2[N << 2], sav[N << 2];
a.resize(len, 0);
b1[0] = 1;
for (k = 2; k <= len; k <<= 1) {
for (i = 0; i < (k >> 1); i++) b2[i] = (b1[i] << 1) % p;
invp(b2, k);
ntt(b1, k, 1);
for (i = 0; i < k; i++) b1[i] = b1[i] * b1[i] % p;
ntt(b1, k, 0);
for (i = 0; i < k; i++) b1[i] = (a[i] + b1[i]) % p;
for (i = 0; i < k; i++) sav[i] = b2[i];
ntt(b1, k << 1, 1);
ntt(sav, k << 1, 1);
for (i = 0; i < (k << 1); i++) b1[i] = b1[i] * sav[i] % p;
ntt(b1, k << 1, 0);
memset(b1 + k, 0, sizeof(long long) * k);
}
for (i = 0; i < n; i++) a[i] = b1[i];
a.resize(n);
memset(b1, 0, sizeof(long long) * (len << 1));
memset(b2, 0, sizeof(long long) * (len << 1));
}

void lnp(vector<long long> &a, int n) {
vector<long long> f;
f = a;
invp(f, n);
deriv(a);
mul(a, f);
integ(a);
a.resize(n, 0);
}

void exp(vector<long long> &a, int n) {
vector<long long> s(1, 0), s2(1, 0);
int len, k, i;
for (len = 1; len < n; len <<= 1);
a.resize(len, 0);
s2[0] = 1;
for (k = 2; k <= len; k <<= 1) {
s.resize(k, 0);
s2.resize(k, 0);
for (i = 0; i < (k >> 1); i++) s[i] = s2[i];
lnp(s, k);
for (i = 0; i < k; i++) s[i] = (a[i] - s[i] + p) % p;
s[0] = (s[0] + 1) % p;
mul(s2, s);
s2.resize(k, 0);
}
for (i = 0; i < n; i++) a[i] = s2[i];
a.resize(n);
}

void cdqmul(vector<long long> &f, vector<long long> &g, int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2;
cdqmul(f, g, l, mid);
vector<long long> lf, lg;
for (int i = l; i <= mid; ++i) lf.push_back(f[i]), lg.push_back(g[i - l]);
for (int i = mid + 1; i <= r; ++i) lg.push_back(g[i - l]);
NTT::mul(lf, lg);
for (int i = mid + 1; i <= r; ++i) {
int pos = i - l;
f[i] = (f[i] + lf[pos]) % p;
}
cdqmul(f, g, mid + 1, r);
}

} // namespace NTT

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

vector<long long> fac(N, 0), inv(N, 0);
fac[0] = inv[0] = 1;
for (int i = 1; i < N; ++i) {
fac[i] = fac[i - 1] * i % mod;
}
inv[N - 1] = NTT::power(fac[N - 1]);
for (int i = N - 2; i >= 1; --i) {
inv[i] = inv[i + 1] * (i + 1) % mod;
}

int m, op;
cin >> m >> op;

vector<long long> f(m + 5, 0), g(m + 5, 0);
for (int i = 0; i <= m; ++i) {
f[i] = NTT::power(2ll, 1ll * i * (i - 1) / 2) * inv[i] % mod;
g[i] = NTT::power(2ll, 1ll * i * (i - 1) / 2) * inv[i] % mod;
}

NTT::mul(f, g);
for (int i = 1; i <= m; ++i) {
f[i] = f[i] * fac[i] % mod;
f[i] = f[i] * NTT::power(inv[2], 1ll * i * (i - 1) / 2) % mod;
}

if (op == 1) {
for (int i = 1; i <= m; ++i) {
cout << f[i] - 1 << "\n";
}
} else {
long long ans = 0;
for (int i = 1; i <= m; ++i) {
ans ^= f[i] - 1;
}
cout << ans << "\n";
}

return 0;
}