数学题目合集
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[]\) 的 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\) 个才行。
考虑倍增(矩阵快速幂)的思路。
转化为求中间那个矩阵的 \(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\)。
法一:
然后和上题类似优化。复杂度 \(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\)。
注意到 \((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!\)。
定义 \(a_x=\dfrac{[x\in A]}{x!}\)。
记 \(S=j+k\),改变枚举顺序,先枚举 \(S\)。
定义 \(G_S=\sum_{j\ge 1,k\ge 1,j+k=S}F_jF_k\)。
这里已经可以 \(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}}\)
\(m\) 比较小,直接爆算即可。
数幂求和问题1
给定 \(n,m\),\(s_i=\displaystyle\sum_{j=0}^{n-1}j^i\),求 \(s_0\sim s_m\)。
法一:
(\(\sum_{x=0}^{n-1}x^{\underline{j}}=\dfrac{n^{\underline{j+1}}}{j+1}\))
法二:
考虑 \(s\) 的 EGF \(s(x)\)。
但是要注意 \(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\)。多项式逆即可。
如何优雅地求和
给定一个 \(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\)。