数学题目合集

CF10E 题解

翻转

性质:如果翻转的区间所有数对个数为偶,则整个逆序对个数奇偶性不变;否则改变。

证明:首先翻转区间外的逆序对个数不会变化,翻转区间与翻转区间外的逆序对个数也不会变化。

假设翻转前翻转区间内有 \(cnt\) 个逆序对,则翻转后有 \(len\times (len-1)/2-cnt\) 个逆序对,差为 \(len\times(len-1)/2-2\times cnt\),奇偶性由 \(len\times (len-1)/2\) 决定,即区间所有数对个数。

HDU2588

\(1\sim n\) 中与 \(n\)\(gcd\ge m\) 的数的个数。\(n:1e9\)

\(gcd(x,n)=g\ge m\),设 \(x=ga,n=gb\)\((a,b)=1\)

我们枚举 \(g\),然后因为 \(x=ga\),所以 \(a\) 的个数就是 \(x\) 的个数。而 \(a\) 的限制条件是 \((a,b)=1\),也就是 \((a,n/g)=1\),因为 \(a=x/g,x\le n\) 所以 \(a\le n/g\)

因此 \(a\) 的个数就是 \(\varphi(n/g)\)

\(O(\sqrt n)\) 枚举所有 \(\ge m\)\(n\) 的因子,对它们的 \(\varphi\) 求和即可。求欧拉函数直接 \(O(\sqrt x)\) 求。

arc117e

\(+1\) 看作向上走一步,\(-1\) 表示向下走一步,可以画出一个折线图。

若这个折线图中等于 \(i\) 的有 \(a_i\) 个点,那么就会贡献 \(C_{a_i}^2\) 个等于 \(0\) 的子序列。

考虑从上往下,一层层 DP。可以看作是有一条横线从上到下扫过来。

\(dp[sz][cnt][gap]\) 表示 (有 \(sz\) 个点 且 此时一共有 \(cnt\) 个和为 \(0\) 的子序列 且 有 \(gap\) 个空隙)的方案数。

注意这里其实是省略了一维的,按理应该还有一个 “放了 \(i\) 层”,但是可以滚动数组。

转移方程:\(dp[sz+x][cnt+C_x^2][x-(gap+2)] += dp[sz][cnt][gap]\times C_{x-1}^{(gap+2)-1}\)

其中 \(x\) 是枚举的数,表示这一层要放多少个点。

解释一下 \(x-(gap+2)\),因为中间有 \(gap\) 个空隙,加上最左边最右边,至少放 \(gap+2\) 个点在这一层。这是最低预算:即每个空隙只放一个点。而每多放一个点,相当于把一个本来在这一层合并的空隙隔开了,也就是多一个空隙。(这里注意一下,一个空隙并不是最多放两个,也可以放三个得到两个空隙,交给再下一层填补

一共有 \(x\) 个,要在 \(gap+2\)\(gap\) 个空隙和两端)个空里面放,每个空至少一个。方案数是 \(C_{x-1}^{(gap+2)-1}\),所以还要乘这个系数。

DP 结束,统计答案的时候,枚举比 \(0\) 大的部分为 \(dp[x][y][z]\),则比 \(0\) 小的部分就是 \(dp[2n+1-x][k-y][z-1]\)。(为啥是 \(z-1\)?想象比 \(0\) 大的部分翻折下来了,就知道下面为啥 \(z-1\) 个空隙)

Placing Squares

参考第一篇题解。

把平方看作放球。

P7154 及其题解

~k Perm Countings(AGC005D)及其题解

最小子树统计(无题号)

题意:给定一颗树。定义 \(f(S)\) 为包含 \(S\) 的最小连通块点数。其中 \(S\) 是一个点集。求 \(\sum_{S\subset V}f(S)\)

\(g(S)\) 为包含 \(S\) 最小连通块的边数。显然 \(f(S)=g(S)+1\)

\(\sum_{S\subset V}f(S)=\sum_{S\subset V}g(S)+2^{|V|}=\sum_{e\in E}\sum_{S\subset V}[e\in g(S)] + 2^{|V|}\)。注:\([e\in g(S)]\)\(e\) 是包含 \(S\) 的最小连通块中的边时为 \(1\),否则 \(0\)

而设 \(e\) 把树分成两半,一半有 \(l(e)\) 个点,另一半 \(r(e)\) 个点,则 \(\sum_{S\subset V}[e\in g(S)]=2^{|V|}-2^{|l(e)|}-2^{|r(e)|}+1\),就是 \(S\) 一共有 \(2^{|V|}\) 个,不用到 \(e\) 的有三种:\(S\) 只包含 \(l(e)\)\(S\) 只包含 \(r(e)\) 和空集,减去这三类。

Trinomial 题解

题意:求 \((x^2+x+1)^n\) 的第 \(i\) 项系数模 \(3\)\(n\le 10^{15},i\le 2\times n\)。多测。

\((x^2+x+1)^n=((x-1)^2+3x)^n\)。根据二项式定理,\(((x-1)^2+3x)^n=\displaystyle\sum_{i=1}^nC_n^i(x-1)^{2i}(3x)^{n-i}\)

可以发现除了 \(i=n\) 的这一项(\((x-1)^{2n}\))系数都是 \(3\) 的倍数。所以只要算 \((x-1)^{2n}\) 的第 \(i\) 项系数。

再来一次二项式定理。

\((x-1)^{2n}=\displaystyle\sum_{i=1}^{2n}C_{2n}^ix^i(-1)^{2n-i}\)

\(i\) 项系数为 \(C_{2n}^i(-1)^{2n-i}\),可以用 Lucas 定理(模 \(3\))。

P4562 游戏

题意:每次从 \([l,l+n-1]\) 中选择一个 \(vis2[i]=0\)\(i\),并令 \(vis2[i]=1,vis1[k\times i]=1\)。(\(vis1\) 是另一个标记,即让 \(i\) 的倍数都打标记)
对于每一个选择 \(i\)\([l,l+n-1]\) 的排列 \(p\),定义 \(t(p)\) 表示按 \(p\) 的顺序选择 \(i\),选择几个后让 \(vis1[l\sim l+n-1]\) 均为 \(1\)
求所有排列 \(p\)\(t(p)\) 之和。\(l,l+n-1\le 10^7\)

转化一下:令 \(pos\) 为第一个让 \(vis1[l\sim l+n-1]=1\) 的期望位置。则答案为 \(pos\times n!\)

\([l,l+n-1]\) 中不是其他任何数的倍数的数称作 "关键数"。\(pos\) 就是最后一个关键数的期望位置。

最后一个关键数的期望位置,可以转换为排在所有关键数之后的非关键数的期望个数。观察到两个非关键数之间没有影响,考虑逐个加入非关键数。

不妨设一共 \(k\) 个关键数,它们把序列分成 \(k+1\) 段,每一个非关键数都可能随机出现在这 \(k+1\) 段中的任意一段。所以落在最后一段的概率是 \(\dfrac{1}{k+1}\)

一共有 \(n-k\) 个非关键数,所以排在所有关键数之后的非关键数的个数期望是 \(\dfrac{n-k}{k+1}\)。所以最后一个关键数的期望位置是 \(n-\dfrac{n-k}{k+1}=\dfrac{k(n+1)}{k+1}\)

\(pos=\dfrac{k(n+1)}{k+1}\),所以答案是 \(n!\cdot \dfrac{k(n+1)}{k+1}\)

看电影

题意:有 \(n\) 个人 \(k\) 个座位(座位排成一排),要给人分配座位。
分配的方式是从 \([1,k]\) 里随机一个整数 \(l\),若 \(l\) 是空位,让这个人坐下;否则找到 \([l,k]\) 中第一个空位坐下。如果 \([l,k]\) 没有空位就站着。
问所有人都有座位的概率,输出一个最简分数。

AVL-Trees: Gym-100341C

题意:AVL Tree 满足每个结点左右子树高度差 \(\le 1\)。求 \(n\) 个点高度 \(h\) 的 AVL Tree 个数。(高度定义为边数)
\(h\le 15, n\le 2^16 - 1\),答案对质数 \(786433\) 取模。

动态规划:\(f_h[n]\) 表示高度 \(h\) 点数 \(n\) 方案数。

\[f_h[n]=\sum_{i=0}^{n-1}f_{h-1}[i]f_{h-1}[n-i-1]+2\sum_{i=0}^{n-1} f_{h-1}[i]f_{h-2}[n-i-1] \]

考虑 \(f_h[]\) 的 OGF:\(F_h(x)=f_h[0]+f_h[1]x+f_h[2]x^2+\cdots\)。则 \(F_h(x)=x(F_{h-1}(x)F_{h-1}(x)+2F_{h-1}(x)F_{h-2}(x))\)

目标:求 \(F_h(x)\) 的第 \(n\) 项系数。而它的次数最高是 \(65535\):因为 \(h\) 高度的二叉树最多这么多。

转化:\(F_h(x)\)\(w^0\sim w^{65535}\) 的值,\(w\) 是模 \(786433\) 意义下的 \(65536\) 次方根。

把这 \(O(2^h)\)\(x\) 代入,再 \(O(h)\) 推出来,可以在 \(O(h\cdot 2^h)\) 的复杂度内算出 \(O(2^h)\) 个点值,然后插值回去。

Buying Snacks:HDU-7057

题意:\(n\) 种零食,每种零食可以花 \(2\) 块或者 \(1\) 块。每种零食只能选择一种价格。如果同时买第 \(x\) 种和第 \(x+1\) 种,可以选择优惠 \(1\) 元。(然后不能再让 \(x-1\)\(x\) 一起优惠)
给定 \(n\le 10^9,m\le 2\times 10^4\)。对 \(1\le k\le m\),问花掉恰好 \(k\) 元的方案数。

状态描述:\(f_i[j]\) 表示前 \(i\)\(j\) 元的方案数。

\(f_i[j]=f_{i-1}[j]+f_{i-1}[j-1]+f_{i-1}[j-2]+f_{i-2}[j-1]+f_{i-2}[j-3]+2f_{i-2}[j-2]\)

考虑 OGF:\(F_i(x)=F_{i-1}(x)(x+x^2+x^3)+F_{i-2}(x)(x+x^3+2x^2)\)。目标是求前 \(m\) 项系数。

注意这里取 \(m+1\) 个点值是求不出来的,因为会受到比 \(m+1\) 更大的项的干扰。如果要点值转换,要 \(n+1\) 个才行。

考虑倍增(矩阵快速幂)的思路。

\[\begin{bmatrix}F_i(x)\\F_{i-1}(x)\\ \end{bmatrix}=\begin{bmatrix}1+x+x^2&x+2x^2+x^3\\1&0\\\end{bmatrix}\cdot \begin{bmatrix}F_{i-1}(x)\\F_{i-2}(x)\\\end{bmatrix} \]

转化为求中间那个矩阵的 \(n\) 次方。然后保留 \(m\) 项。

如果用多项式做矩阵乘法,是 \(O(m\log m\cdot \log n)\) 的。但是常数大会被卡。(需要做 \(8\) 次多项式乘法,每次做 \(3\) 次 DFT/IDFT,常数 \(24\)

小优化:可以把 \(x\) 代入 \(m\) 个值,然后 \(O(2\times 2\times 2)\) 的复杂度算出常量,然后再 IDFT,做 \(12\) 次即可。

CF755G

\(n\) 个球排一行,选 \(1\le k\le m\) 组(不相交),每一组要么是单个,要么是相邻两个。问方案数模 \(998244353\)\(n\le 1e9,m\le 2e5\)

还是设 \(f_{n,m}\)\(f_{n,m}=f_{n-1,m}+f_{n-1,m-1}+f_{n-2,m-1}\)。类似可得母函数 \(F_n(x)=F_{n-1}(x)(1+x)+F_{n-2}(x)\cdot x\)

法一:

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

然后和上题类似优化。复杂度 \(O(\log n\cdot m\log m)\)

法二:

省略 \(F_n(x)\)\((x)\) 变成 \(F_n\)。变成 \(F_n=(1+x)F_{n-1}+xF_{n-2}(x)\),这种类似 Fib 序列的递推形式,在 CM3-2 讲过。
定义 \(G(z)=F_0+F_1z+F_2x^2+\cdots\)

\[\begin{aligned} F_0&=1\\ F_1z&=(1+x)z\\ F_2z^2&=(1+x)F_1z^2+xF_0z^2\\ F_3z^3&=(1+x)F_2z^3+xF_1z^3\\ \cdots&=\cdots\\ \end{aligned} \]

注意到 \((1+x)z=(1+x)F_0z\);左右加起来,可得 \(G(z)=1+(1+x)G(z)z+xG(z)z^2\)
\(G(z)=\dfrac{1}{1-(1+x)z-xz^2}\),经过一通二次方程计算可得:令 \(A=\dfrac{(1+x)+\sqrt{(1+x)^2+4x}}{2},B=\dfrac{(1+x)-\sqrt{(1+x)^2+4x}}{2},u=\dfrac{A}{A-B},v=\dfrac{-B}{A-B}\)\(G(z)=\dfrac{u}{1-Az}+\dfrac{v}{1-Bz}\)

展开得 \(G(z)=u\displaystyle\sum_{n=0}^{\infty}(A^nz^n)+v\sum_{n=0}^{\infty}B^nz^n\),故 \([z^n]G(z)=u\cdot A^n+v\cdot B^n=\dfrac{A^{n+1}-B^{n+1}}{A-B}\)

所以 \(F_n=\dfrac{A^{n+1}-B^{n+1}}{A-B}\),我们目标是求出 \(F_n\) 的前 \(m\) 项系数,所以只要求出分子分母的前 \(k\) 项系数。求 \(A,B\)\(x^k\),然后用多项式快速幂,多项式除法即可。复杂度 \(O(m\log m)\)

Unlucky String(加强)

字符集大小为 \(m\),给定字符串 \(s\)(记 \(k=|S|\))。求有多少个长为 \(n\) 的不包含 \(s\) 为子串的字符串。\(n,m,k\le 10^5\)。模 \(998244353\)

先考虑 DP。

\(f_i\) 表示有多少个长度为 \(i\) 的字符串,\(s\) 在其后缀处恰好出现一次。
\(i<k\)\(f_i=0\),因为 \(s\) 没办法出现;否则 \(f_i=m^{i-k}-\displaystyle\sum_{j=0}^{i-k}f_j\cdot m^{i-k-j}-\sum_{d\in D}f_{i-d}\)
其中 \(x\in D\) 当且仅当 \(s\) 长为 \(k-x\) 的前缀与长为 \(k-x\) 的后缀相同 且 \(1\le x<k\)

(预处理 \(D\)

\(F(x)\)\(f_i\) 的 OGF(其实 \(i\le k\)\(f_i=0\))。为了处理 \(d\in D\),定义 \(d(x)=\sum_{d\in D}x^d\)
\(F(x)=\dfrac{x^k}{1-mx}-\dfrac{x^kF(x)}{1-mx}-F(x)\cdot d(x)\)。移项 \(F(x)=\dfrac{x^k}{(1-mx)(d(x)+1)+x^k}\)
因此 \(f_n\) 可在 \(O(n\log n)\) 时间求出。

答案呢?\(ans=m^n-\displaystyle\sum_{i\ge 0}f_i\cdot m^{n-i}\)。即总共 - 枚举第一个 \(s\) 的位置。

链式反应:UOJ50

求带标号的树个数。有 \(n\) 个点,标号满足堆性质。同时给定集合 \(A\),每个非叶子结点恰好\(x\in A\) 个儿子是叶子,和 \(2\) 个非叶子儿子。

\(f_1=1\)

\(f_i=\displaystyle\dfrac{1}{2}\sum_{1\le j,k \text{且} j+k\le i \text{且} i-1-j-k\in A}{{i-1}\choose {j}}{{i-1-j}\choose{k}}f_jf_k\)
\(f_i=\displaystyle\dfrac{1}{2}\sum_{1\le j,k \text{且} j+k\le i \text{且} i-1-j-k\in A}\dfrac{(i-1)!}{j!k!(i-1-j-k)!}f_jf_k\)

如果直接求是 \(O(n^3)\) 的。

\(F_i=f_i/i!\)

\[f_i=\displaystyle\dfrac{1}{2}\sum_{1\le j,k \text{且} j+k\le i \text{且} i-1-j-k\in A}\dfrac{(i-1)!F_jF_k}{(i-1-j-k)!} \]

定义 \(a_x=\dfrac{[x\in A]}{x!}\)

\[F_i=\dfrac{1}{2i}\displaystyle\sum_{1\le j,k\text{且}j+k<i}F_jF_ka_{i-1-j-k} \]

\(S=j+k\),改变枚举顺序,先枚举 \(S\)

\[F_i=\dfrac{1}{2i}\sum_{S+t=i-1}a_t\sum_{j\ge 1,k\ge 1,j+k=S}F_jF_k \]

定义 \(G_S=\sum_{j\ge 1,k\ge 1,j+k=S}F_jF_k\)

\[F_i=\dfrac{1}{2i}\sum_{S+t=i-1}a_tG_s \]

这里已经可以 \(O(n^2)\) 了。但我们可以用分治 FFT 的思路。

分治 \((l,r)\):目标是求出 \(F_l\sim F_r\)\(G_l\sim G_r\)

先递归进左半边。然后 \(G_l\sim G_{mid}\)\(a\) 卷积得到 \(F_{mid+1}\sim F_r\);用 \(F_l\sim F_{mid}\) 多项式自卷\(G_{mid+1}\sim G_r\)

求和

\(f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\times 2^j \times (j!)\)
S(i, j)表示第二类斯特林数

研究 \(\sum_{j=0}^iS(i,j)\times 2^j\times (j!)\)

考虑其组合意义。\(S(i,j)\) 即把 \(i\) 个数分成 \(j\) 组,\(2^j\) 即每组有 \(2\) 种方案,\(j!\) 即组与组之间要排序。所以这个式子就是 "把 \(i\) 个数分成若干个不同的组,每组黑白染色的方案数"。

记 "把 \(n\) 个数" 的方案数为 \(g_n\)。因为有组合意义,可以把通项公式改成递推公式,再用其他手段优化。

枚举最后一组的数个数,\(g_n=\sum_{i=1}^{n}2\cdot {n\choose i}g_{n-i}\),注意组合数的 \(i\)\(g_{n-i}\)\(n-i\) 刚好能凑到一起,考虑卷积优化。

\(\dfrac{g_n}{n!}=\sum_{i=1}^n\dfrac{g_{n-i}}{(n-i)!}\cdot\dfrac{2}{i!}\)

\(G(x)\)\(\{\dfrac{g_i}{i!}\}\) 的 OGF,\(F(x)\)\(\{\dfrac{2}{i!}\}\) 的 OGF。

注意这里不是 \(G(x)=G(x)\times F(x)\)!!!

因为原式的 \(i\) 可以等于 \(0\)\(i\) 就对应 \(g\)\(n\),即 \(n\ge 0\)。所以 \(g_0\) 有定义:\(g_0=1\)

但是 \(f\)\(n\) 是我们递推公式里枚举的最后一组个数,枚举时 \(n\ge1\)。为了使枚举的时候不统计 \(n=0\) 的情况,令 \(f_0=0\) 而不是 \(f_0=\dfrac{2}{0!}=2\)

所以 \(G(x)=G(x)\cdot F(x)+1\)。为什么要 \(+1\)?因为左边 \(g_0=1\) 对应的项在右边 \(g_0\times f_0\) 变成 \(0\) 了,要补一个 \(1\)

所以只要求出 \(F(x)\),然后 \(G(x)=\dfrac{1}{1-F(x)}\) 就能求得 \(g_0\sim g_n\)。而 \(ans=\sum_{i=0}^ng_i\)

组合数问题

给定一个 \(m\) 次多项式 \(f(k)=\sum a_ik^i\),求 \(\sum_{k=0}^nf(k){n\choose k}x^k\bmod p\)\(p\) 不一定是质数。
\(n,x,p\le 10^9\)\(m\le 1000\)\(m\le n\)

先把 \(f(k)\) 转成下降幂形式 \(\sum b_ix^{\underline{i}}\)

重要公式: \(k^{\underline{i}}{n\choose k}={{n-i}\choose {k-i}}n^{\underline{i}}\)

\[\begin{aligned} \text{原式}&=\sum_{k=0}^n\sum_{i=0}^mb_ik^{\underline{i}}x^k{n\choose k}\\ &=\sum_{k=0}^n\sum_{i=0}^mb_ix^k{{n-i}\choose {k-i}}n^{\underline{i}}\\ &=\sum_{i=0}^mb_in^{\underline{i}}\sum_{k=0}^nx^k{{n-i}\choose {k-i}}\\ \text{当 k<i 时最后的组合数无意义,所以k>=i}\\ &=\sum_{i=0}^mb_in^{\underline{i}}\sum_{k=0}^{n-i}x^{k+i}{{n-i}\choose k}\\ &=\sum_{i=0}^mb_in^{\underline{i}}x^i\sum_{k=0}^{n-i}x^k{{n-i}\choose k}\\ &=\sum_{i=0}^mb_in^{\underline{i}}x^i(x+1)^{n-i}\\ \end{aligned} \]

\(m\) 比较小,直接爆算即可。

数幂求和问题1

给定 \(n,m\)\(s_i=\displaystyle\sum_{j=0}^{n-1}j^i\),求 \(s_0\sim s_m\)

法一:

\[\begin{aligned} s_i&=\sum_{x=0}^{n-1}x^{i}\\ &=\sum_{x=0}^{n-1}\sum_{j=1}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}x^{\underline{j}}\\ &=\sum_{j=1}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}\dfrac{n^{\underline{j+1}}}{j+1}\\ \end{aligned} \]

\(\sum_{x=0}^{n-1}x^{\underline{j}}=\dfrac{n^{\underline{j+1}}}{j+1}\)

法二:

考虑 \(s\) 的 EGF \(s(x)\)

\[\begin{aligned} s(x)&=\sum_{i\ge 0}s_i\dfrac{x^i}{i!}\\ &=\sum_{i\ge 0}\sum_{j=0}^{n-1}j^i\cdot \dfrac{x^i}{i!}\\ &=\sum_{j=0}^{n-1}\sum_{i\ge 0}\dfrac{(jx)^i}{i!}\\ &=\sum_{j=0}^{n-1}e^{jx}=\dfrac{1-e^{nx}}{1-e^x} \end{aligned}\]

但是要注意 \(1-e^{nx}\)\(1-e^x\) 的常数项都是 \(0\),没有多项式逆。怎么办?

\(1-e^x=-\sum_{i\ge 0}\dfrac{1}{(i+1)!}x^{i+1}=-x\sum_{i\ge 0}\dfrac{1}{(i+1)!}x^i\)

\(1-e^{nx}=-\sum_{i\ge 0}\dfrac{n^{i+1}}{(i+1)!}x^{i+1}=-x\sum_{i\ge 0}\dfrac{n^{i+1}}{(i+1)!}x^i\)

一除,\(-x\) 约掉了。所以 \(s(x)=\sum_{i\ge 0}\dfrac{1}{(i+1)!}x^i/\sum_{i\ge 0}\dfrac{n^{i+1}}{(i+1)!}x^i\)。多项式逆即可。

CF722F:Cyclic Cipher 题解

CF1117E:Decypher the String 题解

如何优雅地求和

给定一个 \(m\) 次多项式 \(f(k)\) 的一些点值 \(f(0)\sim f(m)\)
\(Q=\sum_{k=0}^nf(k){n\choose k}x^k(1-x)^{n-k}\bmod 998244353\)
\(n,x,p\le 10^9\)\(m\le 20000\)\(m\le n\)

posted @ 2024-02-20 19:11  FLY_lai  阅读(13)  评论(0编辑  收藏  举报