deepthink 一会。
好吧想明白了,挺唐的。
考虑两个数在 trie 上的 lca 算贡献。
那就枚举 lca,记 lca 的 dep 为
d,
d 前的二进制位没用,暴力枚举后面的位,用一些技巧维护,在 trie 上走。
最后算一算。
复杂度是
O(k2k)。
如何 *2900。
方差:
s2=n∑i=1nai2−n2∑i=1n∑j=1naiaj。
贡献分成三部分:
nai2,n2ai2,n2aiaj,算个系数即可。
第一部分:
i=1∑Li(i−1L−1)=L1i=1∑L(iL)=L2L−1
第二部分:
i=1∑Li2(i−1L−1)=L1i=1∑Li(iL)=L1i=1∑Lj=1∑Li(i−1j−1)=L1i=1∑Lj=1∑Lj(ij)=L1j=1∑Lj2j−1
简单算。
第三部分:
i=2∑Li2(i−2L−2)=L(L−1)1i=1∑Li(i−1)(iL)=L(L−1)1i=1∑Lj=1∑L(i−1j−1)ii−1=L(L−1)1i=1∑Lj=1∑L(ij)ji−1=L(L−1)1j=1∑Lj1i=1∑L(ij)(i−1)=L(L−1)1j=1∑Lj(∑i=1L(ij)i)−(2j−1)=L(L−1)1j=1∑Ljj2j−1−2j+1
也简单算。
线段树维护一些东西就完了。
仔细一点做到
O(n+mlogn),怎么直接最优解了。
CPPvoid solve() {
rd(n), rd(m);
pw[0] = 1;
rep(i, 1, n) (pw[i] = pw[i - 1] + pw[i - 1]) >= mod && (pw[i] -= mod);
inv[1] = 1;
rep(i, 2, n) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
rep(i, 1, n) a[i] = (pw[i] - 1ll) * inv[i] % mod, (b[i] = b[i - 1] + a[i]) >= mod && (b[i] -= mod);
rep(i, 1, n) b[i] = 1ll * b[i] * inv[i] % mod;
rep(i, 1, n) c[i] = (c[i - 1] + (1ll * i * pw[i - 1] - pw[i] + 1 + mod) % mod * inv[i]) % mod;
rep(i, 1, n) c[i] = 1ll * c[i] * inv[i] % mod * inv[i - 1] % mod;
build(1, 1, n);
while (m--) {
rd(op);
if (op == 1) {
rd(l), rd(r), rd(x);
maketag(1, l, r, x);
} else {
rd(l), rd(r);
Info dat = query(1, l, r);
int L = r - l + 1;
int ans1 = 1ll * dat.b * a[L] % mod;
int ans2 = 1ll * dat.b * b[L] % mod;
int ans3 = (1ll * dat.a * dat.a - dat.b + mod) % mod * c[L] % mod;
wrt((0ll + ans1 - ans2 - ans3 + mod + mod) % mod), putchar(10);
}
}
}
单位根反演大学习。
==i=0∑n(in)Fi[k∣i]i=0∑n(in)Fik1j=0∑k−1ωkijk1j=0∑k−1i=0∑n(in)Fiωkij
记一个多项式
G(x)=∑i=0n(in)Fixi,原式就是
k1∑j=0k−1G(ωkj)。
然后发现斐波那契很涩啊,直接拆成
ϕ 和
ψ 就能二项式反演了。
G(x)=55[ϕ(1+ϕx)n−ψ(1+ψx)n]
被击杀了,老实玩矩阵去了。
G(x)=(x+1xx1)1,1n