第一届我要魔怔魔怔魔怔魔怔
我真的服了 FFT 了,你怎么了????
定义广义 \(\mathrm{popcount}\) 生成函数为:
其中,\(A(z) = 1 + z, B(z) = z, C(z) = 1 - z^2\) 的形式 \(F(z) = (1 + z) F(z^2) + \frac{z}{1-z^2}\) 即为 \(\mathrm{popcount}\) 的生成函数。
设下面出现的多项式(除了 \(F(z)\))的次数均为 \(O(k)\) 级别的。
考虑求一些东西:
- \([z^n]F(z)G(z)\)
我们有:
其中 \(A(z) G(z) = P(z^2) + z Q(z^2)\)。
递归进行求解,考虑 \(P(z), Q(z)\) 的次数,发现次数为 \(\frac{\deg G(z) + \deg A(z)}{2}\),也就是说这东西的次数一直是 \(O(k)\) 的。
那么后者可以用 Bostan-Mori 进行有理分式远端求值,总复杂度就是 \(O(k \log k \log^2 n)\)。
- \([z^n] \frac{F(z)G(z)}{H(z)}\)
我们有:
其中 \(A(z) G(z) H(-z) = P(z^2) + z Q(z^2)\),\(H(z)H(-z) = R(z^2)\)。
同样递归进行求解。这里 \(P(z), Q(z)\) 的次数变成了 \(\frac{\deg A(z) + \deg G(z) + \deg H(z)}{2}\) 了,而 \(R(z)\) 的次数显然还是 \(O(k)\),那么说明 \(P(z), Q(z)\) 的次数仍然是 \(O(k)\) 的,那么仍然使用上面的做法递归去做,复杂度就是 \(O(k \log k \log^2 n)\) 的。
- \([z^n] F(z)^2 G(z)\)
我们有:
其中 \(A(z)^2 G(z) = P(z^2) + z Q(z^2)\),\(A(z)B(z)G(z)C(-z) = P'(z^2) + z Q'(z^2)\),\(C(z) C(-z) = R(z^2)\)。
和上一个情况一模一样的分析,次数还是 \(O(k)\),每一次递归都需要调用一次上一个问题的做法,那么复杂度就是 \(O(k \log k \log^3 n)\)。
- \([z^n] \frac{F(z)^2 G(z)}{H(z)}\)
我们有:
其中 \(A(z)^2G(z)H(-z) = P(z^2) + z Q(z^2)\),\(A(z)B(z)G(z)C(-z)H(-z) = P'(z^2) + z Q'(z^2)\),\(H(z) H(-z) = R(z^2)\),\(C(z)H(z)C(-z)H(-z) = R'(z)^2\)。
复杂度分析同上,\(O(k \log k \log^3 n)\)。
- \([z^n] \frac{F(z)^m G(z)}{H(z)}\)
你没事吧?
付费解锁以下内容。
现代社会以海德格尔的一句“一切实践传统都已经瓦解完了”为嚆矢。滥觞于家庭与社会传统的期望正失去它们的借鉴意义。但面对看似无垠的未来天空,我想循卡尔维诺“树上的男爵”的生活好过过早地振翮。
我们怀揣热忱的灵魂天然被赋予对超越性的追求,不屑于古旧坐标的约束,钟情于在别处的芬芳。但当这种期望流于对过去观念不假思索的批判,乃至走向虚无与达达主义时,便值得警惕了。与秩序的落差、错位向来不能为越矩的行为张本。而纵然我们已有翔实的蓝图,仍不能自持已在浪潮之巅立下了自己的沉锚。
“我的生活故事始终内嵌在那些我由之获得自身身份共同体的故事之中。”麦金太尔之言可谓切中了肯綮。人的社会性是不可祓除的,而我们欲上青云也无时无刻不在因风借力。社会与家庭暂且被我们把握为一个薄脊的符号客体,一定程度上是因为我们尚缺乏体验与阅历去支撑自己的认知。而这种偏见的傲慢更远在知性的傲慢之上。
在孜孜矻矻以求生活意义的道路上,对自己的期望本就是在与家庭与社会对接中塑型的动态过程。而我们的底料便是对不同生活方式、不同角色的觉感与体认。生活在树上的柯希莫为强盗送书,兴修水利,又维系自己的爱情。他的生活观念是厚实的,也是实践的。倘若我们在对过往借韦伯之言“祓魅”后,又对不断膨胀的自我进行“赋魅”,那么在丢失外界预期的同时,未尝也不是丢了自我。
毫无疑问,从家庭与社会角度一觇的自我有偏狭过时的成分。但我们所应摒弃的不是对此的批判,而是其批判的廉价,其对批判投诚中的反智倾向。在尼采的观念中,如果在成为狮子与孩子之前,略去了像骆驼一样背负前人遗产的过程,那其“永远重复”洵不能成立。何况当矿工诗人陈年喜顺从编辑的意愿,选择写迎合读者的都市小说,将他十六年的地底生涯降格为桥段素材时,我们没资格斥之以媚俗。
蓝图上的落差终归只是理念上的区分,在实践场域的分野也未必明晰。譬如当我们追寻心之所向时,在途中涉足权力的玉墀,这究竟是伴随着期望的泯灭还是期望的达成?在我们塑造生活的同时,生活也在浇铸我们。既不可否认原生的家庭性与社会性,又承认自己的图景有轻狂的失真,不妨让体验走在言语之前。用不被禁锢的头脑去体味切斯瓦夫·米沃什的大海与风帆,并效维特根斯坦之言,对无法言说之事保持沉默。
用在树上的生活方式体现个体的超越性,保持婞直却又不拘泥于所谓“遗世独立”的单向度形象。这便是卡尔维诺为我们提供的理想期望范式。生活在树上——始终热爱大地——升上天空。
复杂度 \(O(mk \log k \log^{m + 1} n)\)。
Recap:\(\mathrm{popcount}\) 卷 \(\mathrm{popcount}\) 可以 \(O(\log^3 n)\) 解决了。\(\mathrm{popcount}\) 卷 斐波那契数列 可以 \(O(\log^2 n)\) 解决了。把上面这俩玩意上个 \(k\) 阶前缀和都能解决了。我恼了,这都什么玩意。
#include <bits/stdc++.h>
using namespace std;
const int P = 998244353;
int qpow(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) ans = 1ll * ans * a % P;
a = 1ll * a * a % P;
b >>= 1;
}
return ans;
}
struct Polynomial {
vector<int> a;
int len;
Polynomial(int len = 0) : len(len) { a.resize(len + 1); }
void set(int len) { this->len = len, a.resize(len + 1); }
Polynomial(initializer_list<int> l) : len(l.size() - 1), a(l) {}
int& operator[](int b) { return a[b]; }
const int& operator[](const int b) const { return a[b]; }
Polynomial operator*(const Polynomial &b) const {
Polynomial c(len + b.len);
for (int i = 0; i <= len; i++) {
for (int j = 0; j <= b.len; j++) {
c[i + j] = (c[i + j] + 1ll * a[i] * b[j]) % P;
}
}
return c;
}
Polynomial operator+(const Polynomial &b) const {
Polynomial c = *this;
c.set(max(len, b.len));
for (int i = 0; i <= b.len; i++) {
c[i] = (c[i] + b[i]) % P;
}
return c;
}
void trim() {
while (len && !a[len]) len--, a.pop_back();
}
};
pair<Polynomial, Polynomial> split(Polynomial a) {
Polynomial p(a.len / 2), q(a.len / 2);
for (int i = 0; i <= a.len; i++) {
((i & 1) ? q : p)[i / 2] = a[i];
}
p.trim(), q.trim();
return { p, q };
}
Polynomial neg(Polynomial f) {
for (int i = 0; i <= f.len; i++) if (i & 1) f[i] = (P - f[i]) % P;
return f;
}
Polynomial A = {1, 1}, B = {0, 1}, C = {1, 0, P - 1};
int calc0(Polynomial F, Polynomial G, long long n) {
if (!n) return 1ll * F[0] * qpow(G[0], P - 2) % P;
auto p = split(F * neg(G));
return calc0((n & 1) ? p.second : p.first, split(G * neg(G)).first, n / 2);
}
int calc1(Polynomial G, long long n) {
if (!n) return 0;
auto p = split(A * G);
return (calc1((n & 1) ? p.second : p.first, n / 2) + calc0(B * G, C, n)) % P;
}
int calc2(Polynomial G, Polynomial H, long long n) {
if (!n) return 0;
auto p = split(A * G * neg(H));
return (calc2((n & 1) ? p.second : p.first, split(H * neg(H)).first, n / 2) + calc0(B * G, C * H, n)) % P;
}
int calc3(Polynomial G, long long n) {
if (!n) return 0;
auto p = split(A * A * G);
auto q = split(A * B * G * neg(C));
return (calc3((n & 1) ? p.second : p.first, n / 2)
+ 2ll * calc2((n & 1) ? q.second : q.first, split(C * neg(C)).first, n / 2)
+ calc0(B * B * G, C * C, n)) % P;
}
int calc4(Polynomial G, Polynomial H, long long n) {
if (!n) return 0;
auto p = split(A * A * G * neg(H));
auto q = split(A * B * G * neg(C) * neg(H));
return (calc4((n & 1) ? p.second : p.first, split(H * neg(H)).first, n / 2)
+ 2ll * calc2((n & 1) ? q.second : q.first, split(H * neg(H) * C * neg(C)).first, n / 2)
+ calc0(B * B * G, C * C * H, n)) % P;
}
int T;
int main() {
scanf("%d", &T);
while (T--) {
int op; scanf("%d", &op);
if (op == 0) { // 求 popcount(n)
long long n;
scanf("%lld", &n);
printf("%d\n", calc1({1}, n));
}
if (op == 1) { // 求 (popcount * f_k)(n),其中 f_k 为 k 阶斐波那契数
long long n;
int k;
scanf("%lld%d", &n, &k);
Polynomial g(k);
g[0] = 1;
for (int i = 1; i <= k; i++) g[i] = (P - 1);
printf("%d\n", calc2({1}, g, n));
}
if (op == 2) { // 求 (popcount * popcount)(n)
long long n;
scanf("%lld", &n);
printf("%d\n", calc3({1}, n));
}
if (op == 3) { // 求 (popcount * popcount)(n) 前缀和
long long n;
scanf("%lld", &n);
printf("%d\n", calc4({1}, {1, P - 1}, n));
}
}
return 0;
}

浙公网安备 33010602011771号