O(3n) 已经可以通过了,https://www.luogu.com.cn/record/226937722。
核心片段如下:
for (int s = 0; s < (1 << n); ++s) {
if (!s) cout << (ll)f[0] * g[0] % kMod << ' ';
else {
__int128 sum = 0;
int p = __lg(s);
int ss = s ^ (1 << p);
for (int tt = ss; ; tt = (tt - 1) & ss) {
int t = tt | (1 << p);
sum += (ll)f[t] * g[s ^ t] + (ll)f[s ^ t] * g[t];
if (!tt) break;
}
cout << (int)(sum % kMod) << ' ';
}
}