多项式习题

news/发布时间2024/5/12 5:00:15

P3338 [ZJOI2014] 力

给定数组 \(q\),有:

\[E_j=\sum\limits_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum\limits_{i=j+1}^{n}\frac{q_i}{(i-j)^2} \]

求数组 \(E\)

首先把数组从 \(0\) 开始编号。

然后如果有数组 \(g_i=\dfrac{1}{i^2}\)\(g_0=1\),我们发现:

\(E\) 的前半部分就是 \(q\)\(g\) 卷积。

\(E\) 的后半部分就是 \(q\) 翻转后和 \(g\) 卷积。

由于是浮点数,直接上 FFT 卷积就行。

提交记录

P5488 差分与前缀和

给定数组 \(a\),求 \(a\)\(k\) 维前缀和或差分。

显然,每次让 \(a\) 和一个 \(n\) 项的数组 \(\begin{bmatrix}1&1&1&\dots &1\end{bmatrix}\) 卷积一下,就能求一次前缀和;

\(\begin{bmatrix}1&-1&0&\dots&0\end{bmatrix}\) 卷积就能求一次差分。

而卷积有交换律,所以我们只需要用多项式快速幂求出:\(\begin{bmatrix}1&1&1&\dots &1\end{bmatrix}^k\)\(\begin{bmatrix}1&-1&0&\dots&0\end{bmatrix}^k\) ,然后再用 \(a\) 去卷一下就行了。

提交记录

P3723 [AH2017/HNOI2017] 礼物

贺题解+抄同学思路,没有一点是自己想的。

给定两个长度为 \(n\) 的数组,可以对两数组其中之一进行两种操作:

  1. 整体加上一个非负整数 \(c\)
  2. 把第一个放到最后面任意次。

你可以都做或者都不做。

问下式的最小值:

\[\sum\limits_{i=1}^{n}(a_i-b_i)^2 \]

我们如果不限定正负,就可以考虑强制把 \(c\) 加在 \(a\) 上,于是原式变成:

\[\sum\limits_{i=1}^{n}(a_i+c-b_i)^2 \]

推一下式子就是:

\[\sum a_i^2+\sum b_i^2+nc^2+2(\sum a_i-\sum b_i)c -2\sum a_i b_i \]

显然当 \(c=\dfrac{-2(\sum a_i-\sum b_i)}{2n}=\dfrac{\sum b_i-\sum a_i}{n}\) 时取得最小值。

由于 \(c\) 可能加在 \(b\) 身上,我们可以把这种情况也讨论一下,具体到代码就是:

ll c1 = (ll)(((double)sb-(double)sa)/(double)n+0.5) ,c2 = (ll)(((double)sa-(double)sb)/(double)n+0.5);
c1 = c1*c1*n + 2 * (sa-sb) * c1;
c2 = c2*c2*n + 2 * (sb-sa) * c2;
res += min(c1,c2);

其中 \(sa=\sum a_i\)\(sb=\sum b_i\)

由于当数组轮转时,只有 \(-2\sum a_ib_i\) 项在变,我们考虑这一项的最小值怎么求。

其实就是最大化 \(\sum a_i b_i\)

我们考虑转化成卷积形式,即将 \(b\) 数组翻转,然后再复制两倍长接在自己后面,记为 \(b_{rev}\)

我们将 \(a\)\(b_{rev}\) 卷积,结果的 \(n\sim 2n-1\) 项中的最大值即为答案(编号从 \(0\) 开始)。

具体看这个图,就能明白卷积后 \(n\sim 2n-1\) 中的每一项都是一种轮换后的 \(\sum a_ib_i\) 的取值,于是取 \(\max\) 即可。

提交记录

串串匹配相关

给了一个排列,表达了每个字母可以映射成为另一个字母。

给了串 \(s\) 和串 \(t\),求 \(s\) 和每一个 \(t\) 的子串是否匹配。\(s\) 和一个串 \(t'\) 匹配,当且仅当 \(s_i=t'_i\)\(s_i\) 所映射的字母与 \(t_i\) 相等。

对于两个字符,我们定义 \(S(a,b)=(a-b)^2(p_a-b)^2\),其中 \(p_a\)\(a\) 所映射的字符。当 \(S(a,b)=0\) 时,\(a\) 这一位可以和 \(b\) 匹配。

所以对于 \(t\) 的某个子串 \(t'\),只要有:

\[\sum\limits_{i=1}^{\mid s\mid}S(s_i,t'_i)=0 \]

那么 \(s\) 就能和 \(t'\) 匹配。

拆开 \(S(a,b)\)

\[a^2p_a^2+a^2b^2+b^2p_a^2+b^4-2a^2p_ab-2ap_a^2b-2p_ab^3-2ab^3+4ap_ab^2 \]

  1. \(a^2p_a^2\) 是定值。
  2. \(b^4\) 前缀和就行,\(O(1)\) 查询。
  3. \(-2a^2p_ab\),把 \(s\) 串翻转,分别以 \(a^2p_a\)\(b\) 为系数卷积即可。
  4. \(-2ap_a^2b\),卷积即可。
  5. \(-2p_ab^3\),卷积即可。
  6. \(-2ab^3\),卷积即可。
  7. \(4ap_ab^2\),卷积即可。
  8. \(a^2b^2\),卷积即可。
  9. \(p_a^2b^2\),卷积即可。

当然,我们以 \(b\) 为主元,合并一下同类项:

\[b^4 + (-2a-2p_a)b^3+(4ap_a+a^2+p_a^2)b^2+(-2a^2p_a-2ap_a^2)b+a^2p_a^2 \]

总而言之,卷积即可!

。。。逆天出题人卡 \(998244353\),于是我们给每个字符赋一个随机的权值,反正这个做法只要保证相同的字符权值相同就行,这样就能不被卡了!

提交记录

写题解了

P4173 残缺的字符串

我曾经有一种 312 次 NTT 的做法,但这里时限太小常数太大,我写不下。

他敢给我开五秒,我就敢给你说这是正解。——Qcfff

嗯。我们忽略那种烧包做法。

还是字符串匹配,带个通配符。

还是构造一个字符间的匹配函数 \(S(s_i,t_j)\),要满足能匹配是 \(0\),不能匹配是正数。

可以这么构造(我孬子咧了愣是没想到):

\[S(s_i,t_j)=\Big(val(s_i)-val(t_j)\Big)^2val(s_i)val(t_j) \]

然后我们令小写字母的 \(val()\) 价值函数互不相同,通配符的价值为 \(0\)

跑一边就行了。

提交记录

双倍经验:BZOJ4503. 两个串

P4199 万径人踪灭

这不乱写?——Qcfff

给定一个只有 \(\tt{a},\tt{b}\) 组成的紫狐汆 \(s\),求满足以下条件的子序列个数:

  • 位置和字符都回文。
  • 不连续

我们可以求出,以每个字符或每个空隙为回文中心,其左右有多少对回文字符对。

我们令 \(val({\tt a})=1\)\(val({\tt b})=2\)

然后考虑匹配函数:

\[S(a,b)=\Big(val(a)-val(n)\Big)^2val(a)val(b) \]

是不是和上个题很像?我们用 \(s\) 串和它自己依照这个卷积,得到一个结果。先来张图:

紫色字体表示权值,绿色字体代表编号。

我们保留这个卷积的前 \(2n\) 项,于是乎我们通过手玩,发现对于卷积结果的第 \(i\) 项,有:

  • \(i\) 为偶数,则这个卷积的结果代表了对称轴为 \(\dfrac{i}{2}\),左右两边不匹配的字符对个数的\(2\)

  • \(i\) 为奇数,则这个卷积的结果代表了对称轴为 \(\dfrac{i-1}{2}\)\(\dfrac{i-1}{2}+1\) 之间的空隙,左右两边不匹配的字符对个数的\(2\)

这个图也刚好解释了我们为什么非要把 \(val(a)val(b)\) 乘进去,因为这样刚好可以把对称轴大于 \(\dfrac{n}{2}\) 的部分结果算出来。

然后我们对于每一个作为对称轴的位置,计算左右的总字符对对数减去卷积结果的 \(\dfrac{1}{2}\),就能算出对称轴为这个位置时,左右相等的对数,记为 \(v_i\big(i\in[0,2n)\big)\),这里 \(i\) 对应了一个对称轴,其对称轴上面解释过了。

接下来接着考虑原问题。不连续不好算,我们正难则反,考虑用无限制的减去连续的。

无限制的显然就是 \(\sum\limits_{i=0}^{2n-1}2^{v_i}-1\),表示对于每个位置作为对称轴时,其左右每一对都可以选或不选,再额外减去啥也不选的情况。

连续的话就是回文子串个数了,可以用 Manacher \(O(n)\) 算,也可以字符串哈希 \(O(n\log n)\) 算。后者好写就用了它。

提交记录


图计数相关

关于图计数,有一个共同步骤:

\(f_i\) 表示 \(i\) 个节点的连通某图数量,其 EGF 为 \(\hat F(x)=\sum\limits_{i=0}\dfrac{f_ix^i}{i!}\)\(f_0=0\))。

\(g_i\) 表示 \(i\) 个节点的某图数量,其 EGF 为 \(\hat G(x)=\sum\limits_{i=0}\dfrac{g_ix^i}{i!}\)\(g_0=1\))。

我们有:

\[\mathrm{e}^{\hat F(x)}=\hat G(x) \]

两边求 \(\ln\),有:

\[\hat F(x)=\ln \hat G(x) \]

即为:连通的 \(\exp\) 的一般的,一般的 \(\ln\) 是连通的。

P4841 [集训队作业2013] 城市规划

抄题解。

\(n\) 个点无重边无自环有标号的无向连通图个数。

我们设 \(f_n\) 为上述数量。

\(g_n\)\(n\) 个点无重边无自环有标号的无向图个数,也就是不保证联通。

考虑用两种方式表达 \(g_n\)

首先直接想,从 \(n\) 个点中选出 \(2\) 个点,方案有 \(\dbinom{n}{2}\) 中,这每一组点之间的边都可连可不连,于是有:

\[g_n=2^{\binom{n}{2}} \]

其次,考虑用 \(f\) 来表示 \(g_n\)

我们考虑点 \(1\) 所在的连通块。枚举连通块大小为 \(i\)

此时,从剩余的 \(n-1\) 个点中选出 \(i-1\) 个点,和 \(1\) 组成连通块,方案有 \(\dbinom{n-1}{i-1}\) 中;

\(i\) 个点在连通块里的方案数为 \(f_i\)

而除去这 \(i\) 个点,剩余的 \(n-i\) 个点之间的无向图个数为 \(g_{n-i}\)。于是有:

\[g_n=\sum\limits_{i=1}^{n}\dbinom{n-1}{i-1}f_ig_{n-i} \]

\(g\) 都写成第一种表达方式:

\[2^{\binom{n}{2}}=\sum\limits_{i=1}^{n}\binom{n-1}{i-1}f_i\cdot 2^{\binom{n-i}{2}} \]

把组合数拆开,有:

\[2^{\binom{n}{2}}=\sum\limits_{i=1}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}f_i\cdot 2^{\binom{n-i}{2}} \]

左右同时除以 \((n-1)!\),有:

\[\frac{2^{\binom{n}{2}}}{(n-1)!}=\sum\limits_{i=1}^{n}\frac{f_i}{(i-1)!}\cdot\frac{2^{\binom{n-i}{2}}}{(n-i)!} \]

这是个卷积的形式。具体地,我们设:

\[A(x)=\sum\limits_{i\ge 1}\frac{2^{\binom{i}{2}}}{(i-1)!}x^i,B(x)=\sum\limits_{i\ge1}\frac{f_i}{(i-1)!}x^i,C(x)=\sum\limits_{i=0}\frac{2^{\binom{i}{2}}}{i!} \]

我们就有:

\[A(x)=B(x)C(x) \]

于是:

\[B(x)=\frac{A(x)}{C(x)} \]

多项式求逆即可。

提交记录


还有另一种求法,就是用最开头提到的做法,令 \(g_i=2^{\binom{i}{2}}\),其 EGF:

\[\hat G(x)=\sum\limits_{i=0}\frac{2^{\binom{i}{2}}x^i}{i!} \]

若答案的 EGF 为 \(\hat F(x)\),有:

\[\hat F(x)=\ln \hat G(x) \]

于是多项式 \(\ln\) 即可。

提交记录

P7364 有标号二分图计数

很不会做。遂题解抄之。(二分图啥性质忘光了)

首先题干没说二分连通图,意味着图可以不连通。

设有标号二分连通图的 EGF 为 \(\hat F(x)\),也就是说:

\[\hat F(x)=\sum\limits_{i=0}f_i\frac{x^i}{i!} \]

其中 \(f_i\) 为有 \(i\) 个点的有标号二分连通图的个数。

我们要求的是有标号二分图,可以不连通。考虑其 EGF 为 \(\hat G(x)\)。于是根据开头提到的做法,有:

\[\hat G(x)=e^{\hat F(x)} \]

我们发现 \(\hat F(x)\) 不好求,于是考虑另一种表达 \(\hat F(x)\) 的方式。

我们定义 \(n\) 个点的 “二分染色图” 个数为:\(n\) 个点的二分图(可以不连通)的个数,其中二分图进行了黑白染色。两个 “二分染色图” 不同,当且仅当边不同,或点的颜色不同。

考虑 “二分染色图” 的 EGF 为 \(\hat H(x)\)。我们用两种方式表达 \(H(x)\)

  1. 考察其 \(\left[\dfrac{x^n}{n!}\right]\) 项系数 \(h_n\),表示由 \(n\) 个点组成的 “二分染色图” 的数量,有:

\[h_n=\sum\limits_{i=0}^{n}\dbinom{n}{i}2^{i(n-i)} \]

也就是把 \(n\) 个点分为两部分,一部分大小为 \(i\),全染成白色;另一部分大小为 \(n-i\),全染成黑色。这样划分的方案数为 \(\dbinom{n}{i}\);两部分之间任意一对点都可以选择连不连边,于是再乘上 \(2^{i(n-i)}\)

  1. 想一想 \(\hat F(x)\)\(\hat H(x)\) 的关系。

我们有:

\[\hat H(x)=\sum\limits_{i=0}\frac{2^i\hat F(x)^i}{i!}=e^{2x} \]

\(m\) 个联通块的 “二分染色图” 个数的 EGF 为:\(\dfrac{2^{m}\hat F(x)^{m}}{m!}\),含义为每个联通块钦定一个颜色,有 \(2^m\) 中钦定方法;再把 \(\hat F(x)\) 通过 EGF 乘积的组合意义,组合起来,就得到了这个东西。

而我们枚举联通块个数,就得到了 \(\hat H(x)\) 的生成函数式子。

考察 \(\hat G(x)\)\(\hat H(x)\) 的关系,有:

\[\hat G(x)=\sqrt{\hat H(x)} \]


于是我们用第一种 \(\hat H(x)\) 的方式算出来 \(\hat H(x)\),再开个根就有了 \(\hat G(x)\)

我们把 \(h_n\) 的式子搬过来,想想怎么预处理 \(H(x)\)

\[h_n=\sum\limits_{i=0}^{n}\dbinom{n}{i}2^{i(n-i)} \]

拆一下组合数,有:

\[h_n=n!\sum\limits_{i=0}^{n}\frac{1}{i!(n-i)!}2^{i(n-i)} \]

然后这个 \(2^{i(n-i)}\) 很逆天。题解告诉我们:

\[i(n-i)=\dbinom{n}{2}-\dbinom{i}{2}-\dbinom {n-i}{2} \]

什么含义呢?在 \(i\)\(n-i\) 中分别选一个的方案数,等于在 \(n\) 个里面选两个,再减去两个都选在 \(i\) 里,和两个都选在 \(n-i\) 里的方案数。于是便有了这个式子。带回去:

\[h_n=n!\sum\limits_{i=0}^{n}\frac{1}{i!(n-i)!}2^{\binom{n}{2}-\binom{i}{2}-\binom {n-i}{2}} \]

提出去一个 \(2^{\binom{n}{2}}\),里面的两个负指数扔到分母,有:

\[h_n=n!2^{\binom n2}\sum\limits_{i=0}^{n}\frac{1}{i!2^{\binom{i}{2}}}\cdot \frac{1}{(n-i)!2^{\binom {n-i}{2}}} \]

就变成非常标志的卷积形式了!就能做了!

记得处理到 \(h_{2n}\),因为要开根。

提交记录

P6295 有标号 DAG 计数

\(n\) 个点,有标号,弱连通的,DAG 图,的个数。

国家集训队2013年王迪的论文中,有讲到:

\(dp_i\) 表示不要求弱连通\(i\) 个点有标号的 DAG 图数量,令 \(dp_0=1\),有:

\[dp_i=\sum\limits_{j=1}^{i}(-1)^{j+1}dp_{i-j}\times2^{j(i-j)}\times\dbinom{i}{j} \]

(他原论文不是这么写的,我换了一下记号)

这个式子足够我们做出这个题:BZOJ2863. 愤怒的元首,甚至暴力卷积就行(除非你想要面对着 \(10^9+7\) 这毒瘤模数写 MTT)。提交记录

让我们回来写这个题。

too_later 这篇题解写的很清楚。

我们之前做二分图计数时有:

\[2^{j(i-j)}=2^{\binom{i}{2}-\binom{j}{2}-\binom{i-j}{2}} \]

带进去,有:

\[dp_i=\sum\limits_{j=1}^{i}(-1)^{j+1}dp_{i-j}\times\frac{2^{\binom{i}{2}}}{2^{\binom{j}{2}}\cdot 2^{\binom{i-j}{2}}}\times\frac{i!}{j!(i-j)!} \]

整理一下:

\[\frac{dp_i}{2^{\binom{i}{2}}i!}=\sum\limits_{j=1}^{i}\frac{(-1)^{j+1}}{2^{\binom{j}{2}}j!}\times\frac{dp_{i-j}}{2^{\binom{i-j}{2}}(i-j)!} \]

我们令:

\[\begin{aligned} &f_i=\frac{dp_i}{2^{\binom{i}{2}}i!}\\ &g_i=\frac{(-1)^{i+1}}{2^{\binom{i}{2}}i!} \end{aligned}\]

我们就有:

\[f_i=\sum\limits_{j=1}^{i}g_jf_{i-j} \]

很像个卷积,但有些细节。我们首先把下界变成 \(0\)

\[f_i=\sum\limits_{j=0}^{i}g_jf_{i-j}-g_0f_i \]

我们于是让 \(g_0=0\),就有:

\[f_i=\sum\limits_{j=0}^{i}g_jf_{i-j} \]

很能卷了。但当我们 \(i=0\) 时,这个式子在表达:\(f_i=g_0f_0=0\),但我们把 \(i=0\) 带进 \(f_i\) 的定义式,发现显然错误。于是我们再填个补丁:

\[f_i=\sum\limits_{j=0}^{i}g_jf_{i-j} + [i=0] \]

这个就完美了。如果 \(f,g\)OGF 分别为 \(F(x),G(x)\),我们就有:

\[F(x)=F(x)G(x)+1 \]

这个 \(+1\) 就是上面那个补丁在起作用。

解方程有:

\[F(x)=\frac{1}{1-G(x)} \]

这样我们就能用 \(O(n\log n)\) 的复杂度,解决不要求弱连通的原问题了。

怎么变成连通呢?我们求出 \(F(x)\) 后就相当于求出了 \(f\) 的每一项。根据 \(f_i\) 的定义式,我们有:

\[dp_i=f_i\cdot 2^{\binom{i}{2}}\cdot i! \]

我们写出 \(dp\)EGF

\[\hat F(x)=\sum\limits_{i=0}\frac{f_i\cdot 2^{\binom{i}{2}}\cdot i!x^i}{i!}=\sum\limits_{i=0}f_i\cdot 2^{\binom{i}{2}}x^i \]

根据最开头提到的连通某图某图的关系,设弱连通 DAG 图的 EGF 为 \(\hat H(x)\),有:

\[\hat H(x)=\ln \hat F(x) \]

我们转成 EGF 后求一下 \(\ln\),就行了。

提交记录


P5641 【CSGRound2】开拓者的卓识

对 Qcfff 的拙劣模仿。思路全是抄他的。

我们可以思考,\(a_i\) 对于 \(S_{k,1,r}\) 的贡献。

我们可以看做:在 \(1\sim i\) 中填 \(k\) 个左括号(可以填在一个位置上)的方案数为 \(L\),在 \(i\sim r\) 中填 \(k\) 个右括号(也可以填在一个位置上)的方案数为 \(R\);则 \(a_i\)\(S_{k,1,r}\) 的贡献就是 \(a_i\cdot L\cdot R\)

因为每个 \(S_{k-1,l,r}\) 只会对 \(\forall L\le l,R\ge r, S_{k,L,R}\) 产生贡献,所以上述结论是正确的。

我们蒙出结论:在长度为 \(len\) 的区间里填 \(k\) 个括号的方案为 \(C_{k+len-1}^{k}\),为什么不知道,但这个是 \(\begin{bmatrix}1&1&\dots&1\end{bmatrix}\)\(k\) 维前缀和的第 \(len\) 项绝对没错,手玩一下 \(len=5,k=3\) 就能明白。但为什么就是这个组合数?刷到的朋友救一下!

于是我们就可以写出一个东西:

\[S_{k,1,r}=\sum\limits_{i=1}^{r}a_i\cdot C_{k+i-1}^{k}\cdot C_{k+r-i}^{k} \]

我们发现一共需要的组合数为 \(C_{k}^{k},C_{k+1}^{k},\dots,C_{k+n-1}^{k}\),这些显然可以 \(O(n)\) 预处理。即:

\[C_{k+i}^{k}=\frac{C_{k+i-1}^{k}\cdot (k+i)}{i} \]

然后我们计算出

\[f=\begin{bmatrix}C_{k}^{k}a_1&C_{k+1}^{k}a_2&\dots&C_{k+n-1}^{k}a_n\end{bmatrix} \]

\[g=\begin{bmatrix}C_{k}^{k}&C_{k+1}^{k}&\dots&C_{k+n-1}^{k}\end{bmatrix} \]

通过手玩小样例,发现答案就是 \(f\)\(g\) 的卷积。ntt 即可。

提交记录

关于为什么有那个组合数的结论,我们这里来证明一下。

原问题可以理解为:有 \(k\) 个球,放进 \(len\) 个盒子里,盒子里可以放多个球,可以空盒子,求方案数。

可以进一步理解为:方程 \(x_1+x_2+\dots +x_{len}=k\) 的非负整数解的组数。

进一步理解为:方程 \(x_1+x_2+\dots +x_{len}=k+len\) 的正整数解的组数。

我们可以看成在 \(k+len-1\) 个空隙中插入 \(len-1\) 个隔板,隔板把球分成了 \(len\) 组,每组就是一个 \(x\) 的解。

所以方案数就是 \(C_{k+len-1}^{len-1}=C_{k+len-1}^{k}\)。证毕。

UVA12298 Super Poker II

有一副扑克,四种花色,点数只能是合数。每种牌都有无限种。有 \(n\) 中牌丢失了,你需要求出四种花色的牌各用一张,拼成 \(a\sim b\) 内每个数的方案数。

我们考虑构造四个数列 \(p_1\sim p_4\),分别代表四种花色。

对于 \(p_i\) 的每一项 \(p_{i,j}\),如果满足下列三个条件就赋值为 \(1\)

  1. \(j\le b\)
  2. \(j\) 为合数
  3. 花色为 \(i\),点数为 \(j\) 的这张牌没有丢失

其它位置赋值为 \(0\)

我们考虑 \(p_i\)\(p_j\) 两序列卷积的意义。不难发现卷积后 \([x^n](p_i\times p_j)\) 代表的意义就是各用一张花色为 \(i\)\(j\),拼成 \(n\) 的方案数。

于是我们把 \(p_1\sim p_4\) 卷起来就行了。

注意这题要用 long double 的 FFT,多测不清空,爆零两行泪

提交记录

CF1548C The Three Little Pigs

显然答案为 \(\sum\limits_{j=0}^{n}\dbinom{3j}{x}\)。多次询问,联想生成函数,我们构造出 OGF:

\[F(x)=\sum\limits_{n=0}x^n\sum\limits_{j=0}^{n}\dbinom{3j}{i} \]

然后很神奇地,更换枚举顺序,有:

\[\sum\limits_{j=0}^{n}\sum\limits_{n=0}\dbinom{3j}{i}x^i \]

后面的东西有封闭形式:

\[\sum\limits_{j=0}^{n}(x+1)^{3j} \]

这个整体,通过错位相减,也能求出封闭形式为:

\[F(x)=\frac{(x+1)^{3n+3}-1}{(x+1)^3-1} \]

理论上来说可以做了。直接暴力跑大除法!

提交记录

CF1251F Red-White Fence

不会做,抄了题解。

我们发现 \(k\),即红栅栏的个数很小。于是我们考虑预处理出:对于每个红栅栏,其左右一共放 \(i\) 个白栅栏有多少种方案。

我们拿其中一个来距离。设 \(f_{i,j}\) 为一共用 \(i\) 个白栅栏,所用的白栅栏高度均 \(\le j\) 的方案数字

发现一种高度的白栅栏只有三种有用的情况:

  1. 没有
  2. 只有一个
  3. 至少两个

我们分别考虑每种情况如何转移

  1. 高度为 \(j\) 的白栅栏没有,此时 \(f_{i,j}=f_{i,j-1}\)

  2. 高度为 \(j\) 的白栅栏只有一个,此时 \(f_{i,j}=f_{i,j-1}+2f_{i-1,j-1}\),即要么不用这个栅栏,要么用它,放左边或放右边共两种情况,故乘以 \(2\)

  3. 高度为 \(j\) 的白栅栏有至少两个,此时 \(f_{i,j}=f_{i,j-1} + 2f_{i-1,j-1} + f_{i-2,j-1}\),即要么不用它,要么只用一个,放左放右各一种所以乘以 \(2\),要么两个都用上,必须左右都放所以只乘 \(1\)

我们发现第一种情况相当于什么也不做,第二种情况相当于给原来的 \(f\) 数组卷上 \(2x+1\),第三种情况相当于给原来的 \(f\) 数组卷上 \((x^2+2x+1)\),所以我们设第二种情况的栅栏共有 \(x_1\) 个,第三种情况的栅栏共有 \(x_2\) 个,于是我们索求的 \(f\) 数组即为:

\[(2x+1)^{x_1}(x^2+2x+1)^{x_2}=(2x+1)^{x_1}(x+1)^{2x_2} \]

对左右分别用二项式定理算系数,然后 NTT 卷积到一起就行了。

提交记录

P4091 [HEOI2016/TJOI2016] 求和

心路历程

给出 \(n\),求:

\[\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}2^j\cdot j! \]

我们知道第二类斯特林数有通项公式。

带进去,有:

\[\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{i}\sum\limits_{k=0}^{j}\frac{(-1)^{j-k}k^i}{k!\cdot(j-k)!}2^j\cdot j! \]

我们发现和 \(i\) 有关的只有一项 \(k^i\),于是我们孤立它,更换枚举顺序,把 \(j,k\) 提到前头:

\[\sum\limits_{j=0}^{n}\sum\limits_{k=0}^{j}\frac{(-1)^{j-k}}{k!\cdot(j-k)!}2^j\cdot j! \sum\limits_{i=j}^{n}k^i \]

然后我们发现后面那一项就是:

\[\sum\limits_{i=j}^{k}=\frac{k^{n+1}-k^j}{k-1} \]

带回去,有:

\[\sum\limits_{j=0}^{n}\sum\limits_{k=0}^{j}\frac{(-1)^{j-k}}{k!\cdot(j-k)!}2^j\cdot j! \frac{k^{n+1}-k^j}{k-1} \]

整理整理,为:

\[\sum\limits_{j=0}^{n}2^j\cdot j!\sum\limits_{k=0}^{j} \frac{k^{n+1}-k^j}{k!(k-1)}\cdot \frac{(-1)^{j-k}}{(j-k)!} \]

发现很像一个卷积,我们把 \(k^{n+1}-k^j\) 拆开:

\[\sum\limits_{j=0}^{n}2^j\cdot j!\Bigg(\sum\limits_{k=0}^{j} \frac{k^{n+1}}{k!(k-1)}\cdot \frac{(-1)^{j-k}}{(j-k)!} - \sum\limits_{k=0}^{j} \frac{k^j}{k!(k-1)}\cdot \frac{(-1)^{j-k}}{(j-k)!}\Bigg) \]

发现前面一坨可以卷积,但后面一坨???

我们相当于在求这玩意:

\[\sum\limits_{j=0}^{i}A_jB_{i-j}j^i \]

卷个毛。卷不了。我超不会推了????

拜 Qcfff 所赐,我们把原式子放出来:

\[\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}2^j\cdot j! \]

我们发现,\(j\) 的上界完全可以变成 \(n\)。然后呢?我们和之前一样推一遍式子。直到孤立 \(i\) 那一步,我们发现了:

\[\sum\limits_{j=0}^{n}\sum\limits_{k=0}^{j}\frac{(-1)^{j-k}}{k!\cdot(j-k)!}2^j\cdot j! \sum\limits_{i=0}^{n}k^i \]

我们 \(i\) 的下界限制 \(j\) 被解除了!!!!!这意味着我们后面的东西变成了:

\[\sum\limits_{i=j}^{k}=\frac{k^{n+1}-1}{k-1} \]

该死的 \(k^j\) 项死掉了!!!它死了哈哈哈哈哈哈哈哈哈哈哈哈

然后我们接着推:

\[\sum\limits_{j=0}^{n}2^j\cdot j!\sum\limits_{k=0}^{j} \frac{k^{n+1}-1}{k!(k-1)}\cdot \frac{(-1)^{j-k}}{(j-k)!} \]

这个东西就能直接卷积了。欲哭无泪。

注意有好几个实现细节:

  1. \(0^0=1\)
  2. 特殊注意一下 \(k=1\) 时,\(\sum\limits_{i=0}^{n}k^i=n+1\)

提交记录

最后大力膜拜 Qcfff 佬!!!

P3711 仓鼠的数学题

求:

\[\sum\limits_{k=0}^{n}a_k\sum\limits_{i=0}^{x}i^k \]

我们有:

\[\sum\limits_{i=0}^{n}i^k=n^k + \frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_in^{k+1-i} \]

带进式子里,有:

\[\sum\limits_{k=0}^{n}a_k\Bigg(x^k + \frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_ix^{k+1-i}\Bigg) \]

拆个括号:

\[\begin{aligned}&\sum\limits_{k=0}^{n}a_kx^k+\\&\sum\limits_{k=0}^{n}a_k\Bigg( \frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_ix^{k+1-i}\Bigg)\end{aligned} \]

前面的东西 \(O(n)\) 乱做。咱考虑后面的东西。咱最好让 \(x\) 的指数正常一点,比如说我们这里内层循环枚举 \(k+1-i\)

\[\sum\limits_{k=0}^{n} \frac{a_k}{k+1}\sum\limits_{i=1}^{k+1}\binom{k+1}{k+1-i}B_{k+1-i}x^{i} \]

然后组合数有对称性,里面的下面还是 \(i\),于是:

\[\sum\limits_{k=0}^{n} \frac{a_k}{k+1}\sum\limits_{i=1}^{k+1}\binom{k+1}{i}B_{k+1-i}x^{i} \]

更换枚举顺序。

\[\sum\limits_{i=1}^{n+1}x^{i}\sum\limits_{k=i-1}^{n} \frac{a_k}{k+1}\binom{k+1}{i}B_{k+1-i} \]

然后看看这整出来的一大坨系数咋算。拆开组合数。

\[\sum\limits_{i=1}^{n+1}x^{i}\sum\limits_{k=i-1}^{n} \frac{a_k}{k+1}\cdot \frac{(k+1)!}{i!(k+1-i)!}B_{k+1-i} \]

一堆 \(k+1\),干脆枚举 \(k+1\)

\[\sum\limits_{i=1}^{n+1}x^{i}\sum\limits_{k=i}^{n+1} \frac{a_{k-1}}{k}\cdot \frac{k!}{i!(k-i)!}B_{k-i} \]

而且现在 \(i\)\(k\) 的上界也一样了。舒服。分母的 \(k\) 和分子的 \(k!\) 约掉一个 \(k\)

\[\sum\limits_{i=1}^{n+1}\frac{x^i}{i!}\sum\limits_{k=i}^{n+1} \Bigg(a_{k-1}\cdot(k-1)!\Bigg) \frac{B_{k-i}}{(k-i)!} \]

\(f_x=a_{x-1}\cdot (x-1)!,g_x=\dfrac{B_x}{x!}\)

原式变为:

\[\sum\limits_{i=1}^{n+1}\frac{x^i}{i!}\sum\limits_{k=i}^{n+1} f_k g_{k-i} \]

我们可以考虑枚举 \(k-i\)

\[\sum\limits_{i=1}^{n+1}\frac{x^i}{i!}\sum\limits_{k=0}^{n+1-i} f_{k+i} g_k \]

拜 Qcfff 所赐的惊人注意力,考虑翻转 \(f\)。记 \(f'_{n+1-k}=f_{k}\),有:

\[\sum\limits_{i=1}^{n+1}\frac{x^i}{i!}\sum\limits_{k=0}^{n+1-i} f'_{n+1-i-k} g_k \]

就~能~算~了~

提交记录

UVA12633 Super Rooks on Chessboard

题干:给你一个 \(n\times m\) 的棋盘,上面有 \(p\) 个“半皇后”,即覆盖一行、一列和一条左上到右下的对角线,求有多少个格子没有被覆盖。

首先借助 \(\color{red}\mathfrak{zzafanti}\) 之力,我们将棋盘顺时针旋转 \(90^{\circ}\),这样子做可以把对角线变成横坐标与纵坐标之和相等的线,方便后面计算。

我们先计算出所有被覆盖格子的数量。编号从 \(0\) 开始。

记:

  • \(X_i=\begin{cases}0 & \text{第 }i \text{ 行没有棋子}\\1&\text{第 }i \text{ 行有棋子}\end{cases}\)
  • \(Y_i=\begin{cases}0 & \text{第 }i \text{ 列没有棋子}\\1&\text{第 }i \text{ 列有棋子}\end{cases}\)

我们记旋转后 \(n\) 表示行数,\(m\) 表示列数。容易计算:

  • 横线的数量 \(t_x=\sum\limits_{i=0}^{n-1}X_i\)
  • 竖线的数量 \(t_y=\sum\limits_{i=0}^{m-1}Y_i\)

于是我们可以算出第一类贡献:

\[res\leftarrow t_x\times m+t_y\times n-t_x\times t_y \]

即所有横线上的格子,加上所有竖线上的格子,再减去交叉点格子。

接下来我们依次考虑横纵坐标和为 \(0\sim n+m-2\) 的对角线。

设当前对角线横纵坐标和为 \(z\)

容易得出该斜线穿过了多少条横线和竖线。设其跨过的行坐标范围为 \(lx\sim rx\),列坐标 \(ly\sim ry\),于是有:

\[res\leftarrow res + (rx-lx+1) - \sum\limits_{i=lx}^{rx}X_i-\sum\limits_{i=ly}^{ry}Y_i \]

上式表达了先让这条斜线覆盖上其占有的格子,然后减去重复计算的横竖线。

这个贡献显然可以通过计算前缀和来计算。\(lx,rx,ly,ry\) 自己画个图找找规律就行了。

但这还不够!我们这条斜线每穿过一个横竖线交叉点时,其贡献就会被减掉两次!

于是我们考虑哪些点会被计算。我们发现,当两条横竖线横纵坐标之和为 \(z\) 时,它会被这条线穿过。

于是我们就多减了这么多:

\[res\leftarrow res + \sum\limits_{i=0}^{z}X_iY_{z-i} \]

这是什么?卷积!而且长得很友好!

于是我们直接卷就行了!至此,我们成功把所有被染色的格子数量算了出来,别忘了我们索求的是未被染色的格子。于是:

\[res\leftarrow n\times m-res \]

就是最终答案了!

提交记录

P5667 拉格朗日插值2

疯狂抄题解。我抄抄抄抄抄抄抄抄抄抄

我感到罪恶感爬上了我的脊背。

题意:

给定一个不超过 \(n\) 次的多项式的 \(n+1\) 个点值 \(f(0),f(1) \dots f(n)\),和一个正整数 \(m\),求 \(f(m),f(m+1) \dots f(m+n)\)

先回顾拉插:

给定 \(n+1\) 个点对 \((x_0,y_0)\dots(x_n,y_n)\),可以确定一个 \(n\) 次的多项式 \(f(x)\),满足 \(\forall i\in[0,n],f(x_i)=y_i\)

\(f(m)\) 的值。

\[f(m)=\sum\limits_{i=0}^{n}y_i\prod_{j=0,j\neq i}^{n}\frac{m-x_j}{x_i-x_j} \]

如果给定的点对为:

\[(0,y_0)\dots(n,y_n) \]

就能写出进一步简化的式子:

\[f(m)=\sum\limits_{i=0}^{n}y_i\prod_{j=-,j\neq i}^{n}\frac{m-j}{i-j} \]


根据题解,我们有:

\[f(m+x)=\sum\limits_{i=0}^{n}f(i)\prod_{j=0,j\neq i}^{n}\frac{m+x-j}{i-j} \]

求积符号分别扔到分子分母,有:

\[f(m+x)=\sum\limits_{i=0}^{n}f(i)\frac{\prod\limits_{j=0,j\neq i}^{n}(m+x-j)}{\prod\limits_{j=0,j\neq i}^{n}(i-j)} \]

易得分母为 \(i!\cdot (-1)^{n-i}\cdot (n-i)!\),分子为 \(\dfrac{(m+x)!}{(m+x-i)(m+x-n-1)!}\)(牢记此题中 \(n<m\)

于是有:

\[f(m+x)=\sum\limits_{i=0}^{n}\frac{f(i)}{i! (-1)^{n-i}(n-i)!}\cdot \dfrac{(m+x)!}{(m+x-i)(m+x-n-1)!} \]

把中间的一项无关系数提出来:

\[f(m+x)=\frac{(m+x)!}{(m+x-n-1)!}\sum\limits_{i=0}^{n}\frac{f(i)}{i! (-1)^{n-i}(n-i)!}\cdot \dfrac{1}{m+x-i} \]

发现里面就是卷积。

我们令:

\[u_i=\frac{f(i)}{i! (-1)^{n-i}(n-i)!} \]

\(i>n\)\(u_i=0\)

还有一个:

\[v_i=\frac{1}{m-n+i} \]

然后我们把 \(u\)\(v\) 求个卷积,考察第 \(x\) 项系数:

\[(u*v)_x=\sum\limits_{i=0}^{x}\frac{f(i)}{i!(-1)^{n-i}(n-i)!}\cdot\frac{1}{m-n+x-i} \]

再考察第 \(n+x\) 项系数:

\[(u*v)_{n+x}=\sum\limits_{i=0}^{n+x}\frac{f(i)}{i!(-1)^{n-i}(n-i)!}\cdot\frac{1}{m+x-i} \]

由于 \(u_{\ge n}=0\),我们上界可以换成 \(n\),于是:

\[(u*v)_{n+x}=\sum\limits_{i=0}^{n}\frac{f(i)}{i!(-1)^{n-i}(n-i)!}\cdot\frac{1}{m+x-i} \]

这说明了什么!

\[\begin{aligned}f(m+x)&=\frac{(m+x)!}{(m+x-n-1)!}\sum\limits_{i=0}^{n}\frac{f(i)}{i! (-1)^{n-i}(n-i)!}\cdot \dfrac{1}{m+x-i}\\&=\frac{(m+x)!}{(m+x-n-1)!}(u*v)_{n+x}\end{aligned} \]

算就完了!

提交记录

hdu 4656 Evaluation

给定 \(n,b,c,d\) 和数组 \(a_{0}\sim a_{n-1}\),我们有:

\[F(x)=\sum\limits_{i=0}^{n-1}a_ix^i \]

\(x_k=b\times c^{2k}+d\),求 \(F(x_0)\sim F(x_{n-1})\)

退市自拔。令 \(0\le m<n\)

\[F(b\times c^{2m}+d)=\sum\limits_{i=0}^{n-1}a_i(b\times c^{2m}+d)^i \]

二项式定理拆开:

\[F(b\times c^{2m}+d)=\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{i}a_i\dbinom{i}{j}b^jc^{2mj}d^{i-j} \]

未知力量告诉我们:

没到这一步嘞呀!——\(\mathfrak{Q\color{red}{cfff}}\)

于是我们拆开组合数:

\[F(b\times c^{2m}+d)=\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{i}a_i\dfrac{i!}{j!(i-j)!}b^jc^{2mj}d^{i-j} \]

整理一下:

\[F(b\times c^{2m}+d)=\sum\limits_{i=0}^{n-1}a_ii!\sum\limits_{j=0}^{i}\dfrac{b^j}{j!}\cdot \frac{d^{i-j}}{(i-j)!}c^{2mj} \]

然后孬坛的来了。咋处理 \(c^{2mj}\) 没有一点头猪。

\(\mathfrak{Q\color{red}{cfff}}\) 言:

更换枚举顺序。

谨遵指令之意:

\[F(b\times c^{2m}+d)=\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}c^{2mj}\sum\limits_{i=j}^{n-1}a_ii!\cdot \frac{d^{i-j}}{(i-j)!} \]

\(2mj=m^2+j^2-(m-j)^2\),于是:

\[c^{2mj}=\frac{c^{m^2+j^2}}{c^{(m-j)^2}} \]

——\(\mathfrak{Q\color{red}{cfff}}\)

我们带进去:

\[F(b\times c^{2m}+d)=\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{m^2+j^2}}{c^{(m-j)^2}}\sum\limits_{i=j}^{n-1}a_ii!\cdot \frac{d^{i-j}}{(i-j)!} \]

整理一下:

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{j^2}}{c^{(m-j)^2}}\sum\limits_{i=j}^{n-1}a_ii!\cdot \frac{d^{i-j}}{(i-j)!} \]

咱把 \(i\) 下界换一下,也就是枚举 \(i-j\)

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{j^2}}{c^{(m-j)^2}}\sum\limits_{i=0}^{n-j-1}a_{i+j}(i+j)!\cdot \frac{d^i}{i!} \]

\(a\) 翻转并乘一个阶乘系数,具体的,\(a'_{n-1-j}=a_{j}j!\),于是有:

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{j^2}}{c^{(m-j)^2}}\sum\limits_{i=0}^{n-j-1}a'_{n-1-j-i}\cdot \frac{d^i}{i!} \]

后面裸卷积,设 \(u_j=\sum\limits_{i=0}^{j}a'_{j-i}\cdot \dfrac{d^i}{i!}\),我们有:

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{j^2}}{c^{(m-j)^2}}u_{n-j-1} \]

有些脑瘫了。把 \(u\) 翻转过来,具体的,\(u'_j=u_{n-1-j}\),于是:

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\dfrac{b^j}{j!}\cdot \frac{c^{j^2}u'_j}{c^{(m-j)^2}} \]

一大坨。我们为了好看一点,记:

\[p_j=\frac{b^jc^{j^2}u_j'}{j!} \]

于是有:

\[F(b\times c^{2m}+d)=c^{m^2}\sum\limits_{j=0}^{n-1}\frac{p_j}{c^{(m-j)^2}} \]

后面是卷积很明显了,但上界很寄。我们不如分开算:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(\sum\limits_{j=0}^{m}\frac{p_j}{c^{(m-j)^2}} + \sum\limits_{j=m+1}^{n-1}\frac{p_j}{c^{(m-j)^2}}\Bigg) \]

第一部分就是裸卷积。设一下 \(q_m=\sum\limits_{j=0}^{m}\frac{p_j}{c^{(m-j)^2}}\),于是:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(q_m + \sum\limits_{j=m+1}^{n-1}\frac{p_j}{c^{(m-j)^2}}\Bigg) \]

后面是啥?我们知道:\((j-m)^2=(m-j)^2\),于是:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(q_m + \sum\limits_{j=m+1}^{n-1}\frac{p_j}{c^{(j-m)^2}}\Bigg) \]

考虑枚举 \(j-m-1\),有:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(q_m + \sum\limits_{j=0}^{n-m-2}\frac{p_{j+m+1}}{c^{(j+1)^2}}\Bigg) \]

烦人。令 \(p'_{n-1-j} = p_{j}\),有:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(q_m + \sum\limits_{j=0}^{n-m-2}\frac{p'_{n-m-2-j}}{c^{(j+1)^2}}\Bigg) \]

\(c'_j=\dfrac{1}{c^{(j+1)^2}}\),有:

\[F(b\times c^{2m}+d)=c^{m^2}\Bigg(q_m + \sum\limits_{j=0}^{n-m-2}p'_{n-m-2-j}c'_{j}\Bigg) \]

终于!裸卷积!设 \(r_n=\sum\limits_{j=0}^{n}p'_{n-j}c'_{j}\),有:

\[F(b\times c^{2m}+d)=c^{m^2}(q_m + r_{n-m-2}) \]

只需枚举。沙比提还要任意模数,出题人孬子全是泡。

提交记录

BZOJ4836. 二元运算

给定一种运算:

\[a\operatorname{opt}b=\begin{cases}a+b & a<b\\a-b &a\ge b\end{cases} \]

给定两个长度分别为 \(n,m\) 的数列 \(a,b\),然后 \(q\) 次询问,每次给定一个 \(c\),求有多少对 \((i,j)\) 满足 \(a_i\operatorname{opt}b_j=c\)

首先看到分治标签,还发现值域和长度同级,于是我们考虑在值域上分治。

\(a\) 序列里数字 \(i\) 出现了 \(A_i\) 次,\(b\) 序列里数字 \(i\) 出现了 \(B_i\) 次。我们想要求出数组 \(c\),满足 \(c_i\) 为询问 \(i\) 的答案。

考虑当前分治的值域为 \([l,r]\)

  • \(l=r\),则此时令 \(c_0\leftarrow c_0+A_l\times B_l\)

考虑 \(\operatorname{opt}\) 的定义,显然当 \(a=b\)\(a\operatorname{opt} b=a-b=0\),于是此时 \(a\)\(b\) 都只能取 \(l\),他们之间做 \(\operatorname{opt}\) 运算只能得到 \(0\),于是把贡献加到 \(c_0\) 上。

  • \(l<r\),则考虑左半边和右半边合并时产生的贡献。

我们令 \(mid = \left\lfloor\dfrac{l+r}{2}\right\rfloor\),我们进行如下处理:

  1. 递归计算 \([l,mid]\)\([mid+1,r]\)

  2. 考虑值域在 \([l,mid]\) 之间的 \(a\) 与值域在 \([mid+1,r]\) 之间的 \(b\)\(\operatorname{opt}\) 的贡献。

这一部分贡献中因为 \(a<b\),有 \(a\operatorname{opt} b=a+b\),卷个积吧。

  1. 考虑值域在 \([l,mid]\) 之间的 \(b\) 与值域在 \([mid+1,r]\) 之间的 \(a\)\(\operatorname{opt}\) 的贡献。

这一部分贡献中因为 \(a>b\),有 \(a\operatorname{opt} b=a-b\),把某一个数组翻转后,卷个积吧。


不难发现这个就是个整体二分的过程。照上面说的跑一遍就行了。

卷积的部分细节怪多的。

提交记录

BZOJ3451. Tyvj1953 Normal

cy 锐评这种笔记意义不大。我不敢苟同。

题意:

time = 0
Solve(Tree a) {time += a.size;if (a.size == 1) return;else {select x in a;delete a[x];}
}

有这么一个点分治,按照上述伪代码运行,在选择 a 中的 x 节点并将其删除后,原树分成了好多个子树,然后对每个子树调用 Solve

我们均匀随机地选择 x,求 time 的期望。

抄题解 by _ANIG_

原本考虑了 \(f_i\) 表示 \(i\) 点被删掉时所处子树的大小,求:

\[E\left(\sum f_i\right)=\sum E(f_i) \]

然后不会了。

发现其实把贡献拆开了,每个点的贡献可以这么计算:

\(f_i\) 表示 \(i\) 所处连通块中,\(i\) 在第几次被删掉。

答案其实还是 \(E\left(\sum f_i\right)\)。因为 \(i\) 所处连通块中,每删掉一个点,\(i\) 都为答案贡献了 \(1\)

这个东西就能算了。等同于计算 \(\sum E(f_i)\),让我们分开考虑。

如果令 \(i\) 为根。每次删掉连通块中一个点,相当于把它和它的子树一并删掉。于是 \(E(f_i)\) 转化成了这个题:Game on Tree,答案为 \(\sum\limits_{j=1}^{n} \dfrac{1}{dep_j}\),其中 \(dep_i=1\)

于是原题变成了:树上任选两个点,它们距离加一的倒数进行求和。我们称之为两个点的贡献之和。

这个可以点分治算。(用正确的点分治去算错误的点分治可还行)

对于当前根,我们需要统计跨过根的路径(包括路径一端在根上)。也就是统计两个点属于不同子树,它们的贡献之和。

可以容斥,也就是用整棵树中任意两个点的贡献之和,减去每颗子树中任意两个点的贡献之和。这两部分是规模不同的相同问题。

我们考虑其中任意一个。把这颗树(可能是原树或者某一棵子树)中的点的深度都拿出来,存一下,设一共有 \(n\) 个点,于是要求:

\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{1}{dep_i+dep_j+1} \]

考虑 \(dep=i\) 的点共有 \(c_i\) 个,令 \(m=\max(dep_i)\),于是:

\[\sum\limits_{i=0}^{m}\sum\limits_{j=0}^{m}\frac{1}{i+j+1}c_ic_j \]

枚举 \(k=i+j\)

\[\sum\limits_{k=0}^{2m}\frac{1}{k+1}\sum\limits_{i=0}^{k}c_ic_{k-i} \]

就是卷积了,就能做了。

提交记录

BZOJ3509. COUNTARI

给定一个长度为 \(n\) 的数组 \(a\),求有多少对三元组 \((i,j,k)\) 满足 \(a_k-a_j=a_j-a_i\)

看到标签分块。于是我们分块。设块长为 \(T\)

枚举一个块,复杂度 \(O(\dfrac{n}{T})\)

分三部分计算。

  1. 对于 \(j\) 在块内,\(i,k\) 在块外的左右两侧,我们把块外两侧卷积起来,枚举 \(j\)\(O(1)\) 查找即可。复杂度 \(O(T+V\log V)\)

  2. 对于 \(i\)\(j\) 在块内,\(k\) 在块外,我们枚举 \(i,j\),然后 \(O(1)\) 查找就行。复杂度 \(O(T^2)\)\(j\)\(k\) 在块内,\(i\) 在块外同理。

  3. 对于 \(i,j,k\) 都在块内,枚举 \(j,k\),然后在 \(j\) 的左边查找就行了。复杂度 \(O(T^2)\)

总复杂度:\(O\left(\dfrac{n}{T}\cdot(T+V\log V)+T^2\right)=O(n+\dfrac{n}{T}V\log V+nT)\)

玄学调调块长就行。

提交记录

CF960G Bandit Blues

拜 Qcfff 与 _ANIG_ 所赐。

参见 九阳哥的博客。

\(f_{i,a}\) 表示一共 \(i\) 个互不相同的数,有 \(a\) 个前缀最大值的方案数。

神奇的枚举其中最小值的位置。最小值在第 \(1\) 个位置时,贡献为 \(f_{i-1,a-1}\),即作为前缀最大值。

不在第一个位置时,贡献为 \((i-1)f_{i-1,a}\),即为选择 \(i-1\) 中一个位置并不作为前缀最大值。

于是有:

\[f_{i,a}=f_{i-1,a-1} + (i-1)f_{i-1,a} \]

就是第一类斯特林数。

\[f_{i,a} = \begin{bmatrix}i\\a\end{bmatrix} \]

考虑答案的计算,枚举 \(n\) 的位置,有:

\[\sum\limits_{i=1}^{n}\binom{n-1}{i-1}f_{i-1,a-1}\times f_{n-i,b-1} \]

也就是:

\[\sum\limits_{i=1}^{n}\binom{n-1}{i-1}\begin{bmatrix}i-1\\a-1\end{bmatrix}\times\begin{bmatrix}n-i\\b-1\end{bmatrix} \]

算两行第一类斯特林数就行了。

提交记录

P2791 幼儿园篮球题

但凡我能知道,斯特林数的性质……

多测,并给定一个 \(L\) 适用于每组测试;每次给定 \(n,m,k\),题意就是在求:

\[\frac{\sum\limits_{x=0}^{k}\dbinom{m}{x}\dbinom{n-m}{k-x}x^L}{\dbinom{n}{k}} \]

分母乱做。分母。不会。瞟了一眼题解。第二类斯特林数???

第二类斯特林数有性质:

\[m^n=\sum\limits_{i=0}^{m}\begin{Bmatrix}n\\i\end{Bmatrix}i!\dbinom{m}{i} \]

套进去!!!

\[\sum\limits_{x=0}^{k}\dbinom{m}{x}\dbinom{n-m}{k-x}\sum\limits_{i=0}^{x}\begin{Bmatrix}L\\i\end{Bmatrix}i!\dbinom{x}{i} \]

组合数有性质:

\[\binom{n}{m}\binom{m}{k}=\binom{n}{k}\binom{n-k}{m-k} \]

发现有两个组合数就是这式子左边。带进去!

\[\sum\limits_{x=0}^{k}\sum\limits_{i=0}^{x}\dbinom{m}{i}\dbinom{m-i}{x-i}\dbinom{n-m}{k-x}\begin{Bmatrix}L\\i\end{Bmatrix}i! \]

之后就是套路推式子了。把 \(i\) 扔出去!

\[\sum\limits_{i=0}^{k}\begin{Bmatrix}L\\i\end{Bmatrix}i!\binom{m}{i}\sum\limits_{x=i}^{k}\dbinom{m-i}{x-i}\dbinom{n-m}{k-x} \]

有一个神奇的东西,范德蒙德卷积的推论:

\[\sum\limits_{i=-l}^{r}\binom{n}{l+i}\binom{m}{r-i}=\binom{n+m}{l+r} \]

发现原式子中 \(l=-i,r=k\),直接把式子带进去!

\[\sum\limits_{i=0}^{k}\begin{Bmatrix}L\\i\end{Bmatrix}i!\binom{m}{i}\binom{n-i}{k-i} \]

我们知道第二类斯特林数 \(\begin{Bmatrix}L\\i\end{Bmatrix}\)\(i>L\) 时取值为 \(0\),于是枚举上界改掉!

\[\sum\limits_{i=0}^{\min(k,L)}\begin{Bmatrix}L\\i\end{Bmatrix}i!\binom{m}{i}\binom{n-i}{k-i} \]

于是预处理出一行第二类斯特林数,\(O(L)\) 回答询问即可。

提交记录

BZOJ3684. 大朋友和多叉树

\(f_n\) 为根节点权值为 \(n\) 的方案数。其OGF为 \(F(x)\)

我们有:

\[f_n=\sum\limits_{k\in D}[x^n]F(x)^k \]

表达的含义就是:枚举根节点子树数量为 \(k\),然后 OGF 组合意义顺序拼接就有这玩意。

于是我们有:

\[F(x)=x+\sum\limits_{k\in D}F(x)^k \]

这里加 \(x\) 的原因是:由于数据范围中 \(k\ge 2\),则 \(F(x)^k\) 中没有一次项;而 \(f_0=0,f_1=1\),一次项系数理应为 \(1\),故加上 \(x\)

于是:

\[F(x)-\sum\limits_{k\in D}F(x)^k=x \]

我们设 \(G(x)=x-\sum\limits_{k\in D}x^k\),有:

\[G\Big(F(x)\Big)=x\Leftrightarrow F\Big(G(x)\Big)=x \]

我们知道 \(G(x)\),于是拉格朗日反演求出其复合逆 \(F(x)\) 的第 \(n\) 项值就行了!

提交记录

CF914G Sum the Fibonacci

\(p_i=\sum\limits_{j=0}^{n}[s_j=i]\)

我们求出:

\[A_k=\sum\limits_{i|j=k,i\&j=0}p_ip_j \]

\[B_k=p_k \]

\[C_k=\sum\limits_{i\otimes j=k}p_ip_j \]

然后求出:

\[T_p=\sum\limits_{i\&j\&k=p}A_if(i)B_jf(j)C_kf(k) \]

计算答案:

\[ans=\sum\limits_{k=0}^{17}T_{2^k} \]

即可。

提交记录

CF755G PolandBall and Many Other Balls

这下脑瘫了。

赛时做法:我们有:

\[ans_m=\sum\limits_{i=0}^{m}\binom{n-i}{i}\binom{n-2i}{m-i} \]

一共选 \(m\) 组,其中枚举 \(i\) 组为两个,方案数通过插板法是 \(\dbinom{n-i}{i}\),剩余的 \(m-i\) 组都是一个,选法为 \(\dbinom{n-2i}{m-i}\),乘一下就有上式。

然后这个东西卷不了一点。卷个积吧。

正解:记 \(f(i,j)\) 为前 \(i\) 个数,放了 \(j\) 组的方案数。

我们有:

\[f(i,j)=f(i-1,j-1)+f(i-2,j-1)+f(i-1,j) \]

分别为在 \(i\) 个位置放一个长度为 \(1\) 的,或者一个长度为 \(2\) 的,或者啥也不放。

初始值:\(f(0,0)=f(1,0)=f(1,1)=1\)

记生成函数:

\[F_i(x)=\sum\limits_{j=0}f(i,j)x^j \]

我们有递推式:

\[F_i(x)=(x+1)F_{i-1}(x)+xF_{i-2}(x) \]

我们要求的就是 \([x^k]F_n(x)\),即 \(f(n,k)\)。初始值:\(F_0(x)=1,F_1(x)=x+1\).

我们写成转移矩阵:

\[\begin{bmatrix}F_{i-1}(x),F_{i-2}(x)\end{bmatrix}\times \begin{bmatrix}(x+1) &1\\x&0\end{bmatrix}=\begin{bmatrix}F_{i}(x),F_{i-1}(x)\end{bmatrix} \]

这个容易证明。于是:

\[\begin{bmatrix}F_{1}(x),F_{0}(x)\end{bmatrix}\times \begin{bmatrix}(x+1) &1\\x&0\end{bmatrix}^{n-1}=\begin{bmatrix}F_{n}(x),F_{n-1}(x)\end{bmatrix} \]

中间的东西矩阵快速幂套多项式乘法计算即可。时间复杂度 \(O(k\log k\log n)\)

提交记录

CF1613F Tree Coloring

把一颗 \(n\) 个节点的树染成 \(n\) 种不同的颜色,使得每个节点都不是其父节点的颜色减一。

那个容斥我想了很久 ——jmc

于是我们考虑容斥。

我们要求的答案就是:任意染色的方案数,减去至少一对父子节点不合法的方案数,加上至少两对父子节点不合法的方案数……

由于颜色互不相同,对于某个节点,它最多有一个儿子的颜色是其减一。

\(c_i\) 为节点的儿子个数(不考虑叶子结点)。

考虑一共有 \(j\) 对父子节点不合法,这些父节点肯定互不相同。而对于某个父节点 \(i\),它可以选择 \(c_i\) 中任意一个,将其颜色染成 \(i\) 的颜色减一。

于是乎我们就转化成:求在 \(c_1\sim c_n\) 中任选 \(j\) 个,求其乘积,再把所有的乘积求和。算出这个后,我们把每对不合法的父子节点当成一组,分配颜色的方案就是 \((n-j)!\)。我们考虑解决前面的问题。

\(f(i,j)\) 为在前 \(i\) 个节点中选择 \(j\) 个,它们的 \(c\) 求积再求和的结果。我们转移:

\[f(i,j)=c_if(i-1,j-1) + f(i-1,j) \]

很清晰。我们构造生成函数:\(F_i(x)=\sum\limits_{j=0}f(i,j)x^j\),于是有:

\[F_i(x)=(1+c_ix)F_{i-1}(x) \]

初始值:\(F_0(x)=1\)。我们最终要求的就是 \(F_n(x)\) 的各项系数,于是我们求:

\[\prod\limits_{i=1}^{n}(1+c_ix) \]

即可。这个东西分治 FFT 就能做,时间复杂度为 \(T(n)=2T(\dfrac{n}{2})+O(n\log n)=O(n\log^2n)\)

于是答案就是:

\[\sum\limits_{i=0}(-1)^i\Big([x^i]F_n(x)\Big)(n-i)! \]

提交记录

CF1580F Problems for Codeforces

不会。抄题解。

其实题解里说的很详细了。这里写几个我认为不易理解的地方。

  1. 关于 \(T(x)=\dfrac{1}{1-A(x)}\)

其实是 \(T(x)=\sum\limits_{i=0}A(x)^i\),即枚举奇段个数,利用 OGF 组合意义顺序拼接得出。

为什么加上 \(A(x)^0\)\(0\) 个奇段啥意思?其实加在了常数项上,我们又不用,所以加上去也没必要。

  1. 关于牛逼转化

对于相邻两个 \(S\)\(B\),有:

\[\begin{aligned}&S+B<m\\ \Leftrightarrow &S+B-\left\lceil\frac{m}{2}\right\rceil < m-\left\lceil\frac{m}{2}\right\rceil\\ \Leftrightarrow &S+B'< \left\lfloor\frac{m}{2}\right\rfloor \end{aligned}\]

所以能够和「\(m/2\) 序列」一一对应。

  1. 关于 \(a_{m,i}=f_{m/2,i}\)

这里只有当 \(i\) 为奇数且不为 \(1\) 时满足。其余情况:

  • \(a_{m,i}=0\)\(i\) 为偶数(毕竟是奇段,长度不能是偶数)

  • \(a_{m,1}=\left\lceil\dfrac{m+1}{2}\right\rceil\),只有一个数且必须是小数,根据小数的定义就有这个。

  1. 关于 \(F(x)=A(x)+\dfrac{B(x)^2}{1-A(x)}\)

先说后面 偶段 + 若干奇段 + 反的偶段 部分为什么是这个。

OGF 组合意义秒了。其实就是:

\[B(x)\times\Bigg(\sum\limits_{i=0}A(x)^i\Bigg)\times B(x) \]

就是顺序拼接!中间的弄成封闭形式即可。

再说前面的 \(A(x)\)。为什么一段 \(\tt{BSBSB\dots BSB}\) 可以和一个奇段对应?对于每个数,我们都用 \(m-1\) 去减它,就能把所有的 \(\tt B\) 变成 \(\tt S\),把 \(\tt S\) 变成 \(\tt B\)

提交记录

CF662C Binary Table

我们设 \(a_i\) 为第 \(i\) 列从上往下当成一个二进制数,这个数是啥。

我们考虑枚举哪些行被反转。具体地,我们枚举一个 \(n\) 位的二进制数 \(i\),其中第 \(j\) 位为 \(1\) 表达第 \(j\) 行被反转(这里从 \(1\) 编号)。

我们发现 \(i\otimes a_j\) 就是第 \(j\) 列按照上述规则反转后的第 \(j\) 列组成的数。

对于一个 \(n\) 位的二进制数 \(x\),我们定义其 \(val\) 为:

\[val(x)=\min (i,x-i) \]

其中 \(i\)\(x\)\(1\) 的出现次数。于是我们求的答案:

\[\min\limits_{i=0}^{2^{n+1}-1}\Bigg(\sum\limits_{j=1}^{m}val(i\otimes a_j)\Bigg) \]

易于理解。紧接着,我们令:

\[b_i=\sum\limits_{j=1}^{m} [a_j=i] \]

于是答案变为:

\[\min\limits_{i=0}^{2^{n+1}-1}\Bigg(\sum\limits_{j=0}^{2^{n+1}-1}b_j\cdot val(i\otimes j)\Bigg) \]

我们如果求出:

\[C_i=\sum\limits_{i\otimes j=k}b_j\cdot val(k) \]

答案就是 \(\min C_i\)

我们有 \(j\otimes k=i\),于是:

\[C_i=\sum\limits_{j\otimes k=i}b_j\cdot val(k) \]

做完了???

提交记录

CF901E Cyclic Cipher

啊?

cy 评价别写了。过于抽象。

P4491 [HAOI2018] 染色

考虑容斥。我们记 \(op_i\) 为至少有 \(i\) 种颜色恰好出现 \(k\) 次的方案数。天才泉此方推出了下面的式子:

\[op_i=\dbinom{m}{i}\dbinom{n}{iS}\Bigg(\prod\limits_{j=0}^{i-1}\dbinom{iS-jS}{S}\Bigg)(m-i)^{n-iS} \]

先从 \(m\) 个颜色中选 \(i\) 个,再从 \(n\) 个位置中选 \(iS\) 个位置来放这些颜色,中间的连乘是计算这些钦定的颜色内部的分配(理解为先放第一种颜色有 \(\dbinom{iS}{S}\) 种方案,再放第二种有 \(\dbinom{iS-S}{S}\) 种方案……乘起来),最后再乘上剩余位置瞎放的方案(只能放除去这 \(i\) 种颜色之外的颜色)。

看起来可没问题,我们容斥一下?

\[ans_{假}=\sum\limits_{i=0}^{\min(\lfloor\frac{n}{S}\rfloor,m)}w_i\times\sum\limits_{j=i}^{m}(-1)^{j-i}op_j \]

但是错了,为什么呢?

比如说 \(11223\),我们钦定一种颜色出现两次时,钦定 \(1\) 和钦定 \(2\) 都会计数这种方案。

凭借直觉,我们发现这个额外重复计数的次数应该是个组合数。于是我们瞎乘个组合数:

\[ans_{真}=\sum\limits_{i=0}^{\min(\lfloor\frac{n}{S}\rfloor,m)}w_i\times\sum\limits_{j=i}^{lim}(-1)^{j-i}\dbinom{j}{j-i}op_j \]

他就对了!

行。这个好像是二项式反演推出来的,但我们蒙对了!

剩余的就简单了。计算 \(op\) 可以 \(O(n)\) 预处理,\(10^7\) 显然能跑。

推一推容斥的式子,枚举 \(j-i\)(我们记 \(lim=\min(\left\lfloor\dfrac{n}{S}\right\rfloor,m)\)):

\[\sum\limits_{j=0}^{lim-i}(-1)^{j}\dbinom{j+i}{j}op_{j+i} \]

组合数拆开:

\[\sum\limits_{j=0}^{lim-i}(-1)^{j}\frac{(j+i)!}{j!\cdot i!}op_{j+i} \]

整理:

\[\frac{1}{i!}\sum\limits_{j=0}^{lim-i}\frac{(-1)^{j}}{j!}(j+i)!op_{j+i} \]

减法卷积,反转数组!设 \(f_i=\dfrac{(-1)^i}{i!}\)\(g_i=i!\cdot op_i\)\(g'_{lim-i} = g_i\),原式变成:

\[\frac{1}{i!}\sum\limits_{j=0}^{lim-i}f_ig'_{lim-i-j} \]

标准的卷积,ntt 就行!

提交记录

P5110 块速递推

生成函数 \(F(x)=\sum\limits_{i=0}a_ix^i\),我们有:

\[F(x)=233xF(x)+666x^2F(x)+x \]

也就是

\[F(x)=\frac{x}{1-233x-666x^2} \]

解出来通项公式:

\[a_i=\frac{\left(\dfrac{233}{2}+\dfrac{13\sqrt{337}}{2}\right)^{n\bmod (p-1)}-\left(\dfrac{233}{2}-\dfrac{13\sqrt{337}}{2}\right)^{n\bmod (p-1)}}{2\left(\dfrac{13\sqrt{337}}{2}+\dfrac{233}{2} \right)-233}\]

光速幂计算即可。

提交记录

P5850 calc加强版

逆天抽象题。贺 Qcfff 的。

题干中的 \(k\) 这里替换成 \(K\)

每种颜色的生成函数 \(F_k(x)=1+kx\),其中 \(k\in[1,K]\)

答案的第 \(n\) 项就是 \(n!\times [x^n]\prod\limits_{k=1}^{K}F_k(x)\)

求后面这个多项式相当于求:

\[\exp \sum\limits_{k=1}^{K}\ln F_k(x) \]

我们有 \(\ln F(x)=\displaystyle \int \frac{F'(x)}{F(x)}\),于是:

\[\exp \sum\limits_{k=1}^{K}\int\frac{(1+kx)'}{1+kx} \]

分子求导为 \(k\),于是:

\[\exp \sum\limits_{k=1}^{K}\int k\cdot (1+kx)^{-1} \]

看这个逆怎么求。找规律发现 \((1+kx)^{-1}=\sum\limits_{i=0}(-kx)^i\),于是:

\[\exp \sum\limits_{k=1}^{K}\int k\sum\limits_{i=0}(-kx)^i \]

把多项式积分的定义带进去:

\[\exp \sum\limits_{k=1}^{K}k\sum\limits_{i\ge 1}\frac{(-k)^{i-1}}{i}x^i \]

更换枚举顺序:

\[\exp \sum\limits_{i=1}^{n}\frac{(-1)^{i-1}x^i}{i}\sum\limits_{k=1}^{K}k^i \]

发现后面的是自然数幂和。但多次询问指数不会。故翻 OI-ing,找到了 \({\color{black}\mathfrak{z}}\color{red}\mathfrak{zafanti}\) 写的一文 《几个自然数幂和计算方法》 一文。里面介绍了一种 \(O(n\log n)\) 求出 \(i\in[1,n]\)\(\sum\limits_{k=1}^{K}k^i\) 的每种取值方法:

我们构造 EGF:

\[\sum\limits_{i=0}\frac{\sum\limits_{k=1}^{K}k^i}{i!}x^i \]

更换枚举顺序:

\[\sum\limits_{k=1}^{K}\sum\limits_{i=0}\frac{(kx)^i}{i!} \]

发现后面的东西就是 \(e^{kx}\),于是:

\[\sum\limits_{k=1}^{K}e^{kx} \]

等比数列求和公式:

\[\frac{e^{(n+1)x}-e^x}{e^x-1} \]

这东西上下常数项都是 \(0\),于是同时除以 \(x\) 后多项式求逆就行了!

别忘了乘阶乘!

于是我们处理出 \(i\in[1,n]\) 时的自然数幂和,然后多项式 \(\exp\),就做完了。

提交记录

普通版中 \(n\le 500\),于是我们直接暴力卷积,反正能跑就完了!

普通版

\[\begin{aligned}\\\\\\\\\\\\\\\\\\\\\end{aligned} \]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/46008648.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

济南泰山攻略

济南 济南攻略 两天泰山 两三天第一天下午

vim编辑器无法鼠标右键粘贴,显示可视

vim /usr/share/vim/vim82/defaults.vim 将set mouse改为r,保存退出即可

LeetCodeHot100 堆 215. 数组中的第K个最大元素 347. 前 K 个高频元素

215. 数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/description/?envType=study-plan-v2&envId=top-100-likedpublic int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>(…

数据结构(九)模拟堆---以题为例

堆排序维护一个集合,初始时集合为空,支持如下几种操作:I x,插入一个数 x; PM,输出当前集合中的最小值; DM,删除当前集合中的最小值(数据保证此时的最小值唯一); D k,删除第 k 个插入的数; C k x,修改第 k 个插入的数,将其变为 x;现在要进行 N 次操作,对于所有…

团队作业1

目录团队管理与项目执行团队展示团队选题团队计划团队成员贡献分数分配 团队管理与项目执行 团队展示团队名称:飞跃队 团队成员:<组长> 赖国颢(3121000389)、李子聪(3121000393)、李济远(3121000303)、黄永名(3121008942)、李兆彬(3121006778)、刘立光(31210…

在 SwiftUI 中使用 Metal Shader

简介 从 iOS 17/macOS 14 开始,SwiftUI 支持使用 Metal shader 来实现一些特效。主要提供三个 View Modifier:colorEffect、 distortionEffect 和 layerEffect 。每个 modifier 的第一个参数是传入的 Shader 实例。 此外,View 实例还新增了一个 visualEffect modifier,用于…