数学题目合集

CF10E 题解

翻转

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

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

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

HDU2588

1n 中与 ngcdm 的数的个数。n:1e9

gcd(x,n)=gm,设 x=ga,n=gb(a,b)=1

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

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

O(n) 枚举所有 mn 的因子,对它们的 φ 求和即可。求欧拉函数直接 O(x) 求。

arc117e

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

若这个折线图中等于 i 的有 ai 个点,那么就会贡献 Cai2 个等于 0 的子序列。

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

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

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

转移方程:dp[sz+x][cnt+Cx2][x(gap+2)]+=dp[sz][cnt][gap]×Cx1(gap+2)1

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

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

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

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

Placing Squares

参考第一篇题解。

把平方看作放球。

P7154 及其题解

~k Perm Countings(AGC005D)及其题解

最小子树统计(无题号)

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

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

SVf(S)=SVg(S)+2|V|=eESV[eg(S)]+2|V|。注:[eg(S)]e 是包含 S 的最小连通块中的边时为 1,否则 0

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

Trinomial 题解

题意:求 (x2+x+1)n 的第 i 项系数模 3n1015,i2×n。多测。

(x2+x+1)n=((x1)2+3x)n。根据二项式定理,((x1)2+3x)n=i=1nCni(x1)2i(3x)ni

可以发现除了 i=n 的这一项((x1)2n)系数都是 3 的倍数。所以只要算 (x1)2n 的第 i 项系数。

再来一次二项式定理。

(x1)2n=i=12nC2nixi(1)2ni

i 项系数为 C2ni(1)2ni,可以用 Lucas 定理(模 3)。

P4562 游戏

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

转化一下:令 pos 为第一个让 vis1[ll+n1]=1 的期望位置。则答案为 pos×n!

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

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

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

一共有 nk 个非关键数,所以排在所有关键数之后的非关键数的个数期望是 nkk+1。所以最后一个关键数的期望位置是 nnkk+1=k(n+1)k+1

pos=k(n+1)k+1,所以答案是 n!k(n+1)k+1

看电影

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

AVL-Trees: Gym-100341C

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

动态规划:fh[n] 表示高度 h 点数 n 方案数。

fh[n]=i=0n1fh1[i]fh1[ni1]+2i=0n1fh1[i]fh2[ni1]

考虑 fh[] 的 OGF:Fh(x)=fh[0]+fh[1]x+fh[2]x2+。则 Fh(x)=x(Fh1(x)Fh1(x)+2Fh1(x)Fh2(x))

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

转化:Fh(x)w0w65535 的值,w 是模 786433 意义下的 65536 次方根。

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

Buying Snacks:HDU-7057

题意:n 种零食,每种零食可以花 2 块或者 1 块。每种零食只能选择一种价格。如果同时买第 x 种和第 x+1 种,可以选择优惠 1 元。(然后不能再让 x1x 一起优惠)
给定 n109,m2×104。对 1km,问花掉恰好 k 元的方案数。

状态描述:fi[j] 表示前 ij 元的方案数。

fi[j]=fi1[j]+fi1[j1]+fi1[j2]+fi2[j1]+fi2[j3]+2fi2[j2]

考虑 OGF:Fi(x)=Fi1(x)(x+x2+x3)+Fi2(x)(x+x3+2x2)。目标是求前 m 项系数。

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

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

[Fi(x)Fi1(x)]=[1+x+x2x+2x2+x310][Fi1(x)Fi2(x)]

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

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

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

CF755G

n 个球排一行,选 1km 组(不相交),每一组要么是单个,要么是相邻两个。问方案数模 998244353n1e9,m2e5

还是设 fn,mfn,m=fn1,m+fn1,m1+fn2,m1。类似可得母函数 Fn(x)=Fn1(x)(1+x)+Fn2(x)x

法一:

[Fi(x)Fi1(x)]=[1+xx10][Fi1(x)Fi2(x)]

然后和上题类似优化。复杂度 O(lognmlogm)

法二:

省略 Fn(x)(x) 变成 Fn。变成 Fn=(1+x)Fn1+xFn2(x),这种类似 Fib 序列的递推形式,在 CM3-2 讲过。
定义 G(z)=F0+F1z+F2x2+

F0=1F1z=(1+x)zF2z2=(1+x)F1z2+xF0z2F3z3=(1+x)F2z3+xF1z3=

注意到 (1+x)z=(1+x)F0z;左右加起来,可得 G(z)=1+(1+x)G(z)z+xG(z)z2
G(z)=11(1+x)zxz2,经过一通二次方程计算可得:令 A=(1+x)+(1+x)2+4x2,B=(1+x)(1+x)2+4x2,u=AAB,v=BABG(z)=u1Az+v1Bz

展开得 G(z)=un=0(Anzn)+vn=0Bnzn,故 [zn]G(z)=uAn+vBn=An+1Bn+1AB

所以 Fn=An+1Bn+1AB,我们目标是求出 Fn 的前 m 项系数,所以只要求出分子分母的前 k 项系数。求 A,Bxk,然后用多项式快速幂,多项式除法即可。复杂度 O(mlogm)

Unlucky String(加强)

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

先考虑 DP。

fi 表示有多少个长度为 i 的字符串,s 在其后缀处恰好出现一次。
i<kfi=0,因为 s 没办法出现;否则 fi=mikj=0ikfjmikjdDfid
其中 xD 当且仅当 s 长为 kx 的前缀与长为 kx 的后缀相同 且 1x<k

(预处理 D

F(x)fi 的 OGF(其实 ikfi=0)。为了处理 dD,定义 d(x)=dDxd
F(x)=xk1mxxkF(x)1mxF(x)d(x)。移项 F(x)=xk(1mx)(d(x)+1)+xk
因此 fn 可在 O(nlogn) 时间求出。

答案呢?ans=mni0fimni。即总共 - 枚举第一个 s 的位置。

链式反应:UOJ50

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

f1=1

fi=121j,kj+kii1jkA(i1j)(i1jk)fjfk
fi=121j,kj+kii1jkA(i1)!j!k!(i1jk)!fjfk

如果直接求是 O(n3) 的。

Fi=fi/i!

fi=121j,kj+kii1jkA(i1)!FjFk(i1jk)!

定义 ax=[xA]x!

Fi=12i1j,kj+k<iFjFkai1jk

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

Fi=12iS+t=i1atj1,k1,j+k=SFjFk

定义 GS=j1,k1,j+k=SFjFk

Fi=12iS+t=i1atGs

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

分治 (l,r):目标是求出 FlFrGlGr

先递归进左半边。然后 GlGmida 卷积得到 Fmid+1Fr;用 FlFmid 多项式自卷Gmid+1Gr

求和

f(n)=i=0nj=0iS(i,j)×2j×(j!)
S(i, j)表示第二类斯特林数

研究 j=0iS(i,j)×2j×(j!)

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

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

枚举最后一组的数个数,gn=i=1n2(ni)gni,注意组合数的 ignini 刚好能凑到一起,考虑卷积优化。

gnn!=i=1ngni(ni)!2i!

G(x){gii!} 的 OGF,F(x){2i!} 的 OGF。

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

因为原式的 i 可以等于 0i 就对应 gn,即 n0。所以 g0 有定义:g0=1

但是 fn 是我们递推公式里枚举的最后一组个数,枚举时 n1。为了使枚举的时候不统计 n=0 的情况,令 f0=0 而不是 f0=20!=2

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

所以只要求出 F(x),然后 G(x)=11F(x) 就能求得 g0gn。而 ans=i=0ngi

组合数问题

给定一个 m 次多项式 f(k)=aiki,求 k=0nf(k)(nk)xkmodpp 不一定是质数。
n,x,p109m1000mn

先把 f(k) 转成下降幂形式 bixi

重要公式: ki(nk)=(niki)ni

原式=k=0ni=0mbikixk(nk)=k=0ni=0mbixk(niki)ni=i=0mbinik=0nxk(niki)当 k<i 时最后的组合数无意义,所以k>=i=i=0mbinik=0nixk+i(nik)=i=0mbinixik=0nixk(nik)=i=0mbinixi(x+1)ni

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

数幂求和问题1

给定 n,msi=j=0n1ji,求 s0sm

法一:

si=x=0n1xi=x=0n1j=1i{ij}xj=j=1i{ij}nj+1j+1

x=0n1xj=nj+1j+1

法二:

考虑 s 的 EGF s(x)

s(x)=i0sixii!=i0j=0n1jixii!=j=0n1i0(jx)ii!=j=0n1ejx=1enx1ex

但是要注意 1enx1ex 的常数项都是 0,没有多项式逆。怎么办?

1ex=i01(i+1)!xi+1=xi01(i+1)!xi

1enx=i0ni+1(i+1)!xi+1=xi0ni+1(i+1)!xi

一除,x 约掉了。所以 s(x)=i01(i+1)!xi/i0ni+1(i+1)!xi。多项式逆即可。

CF722F:Cyclic Cipher 题解

CF1117E:Decypher the String 题解

如何优雅地求和

给定一个 m 次多项式 f(k) 的一些点值 f(0)f(m)
Q=k=0nf(k)(nk)xk(1x)nkmod998244353
n,x,p109m20000mn

posted @   FLY_lai  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示