2021.07.07笔记-数学2

写在前面

讲师:\(SGColin\)

内容:数论分块 欧拉函数求和 组合计数 概率 期望

2021.07.06笔记-数学1见wsy_jim's blog

数论分块

概念

\(1...n\) 按照 $\left \lfloor \frac{n}{i} \right \rfloor $ 的值进行划分

正确性:这里就不证了咕

复杂度:\(O(\sqrt n)\)

\(code:\)

	for(int l=1,r,t;l<=n;l=r+1){
		t=n/l;
//		r=n/t;//在这个例子里不用取min也够用了 
		r=(n/l)?min(n,n/t):n;//一般都会给两个变量有可能超过n所以要取min 
//		cout<<l<<" "<<r<<endl;
		ans+=(r-l+1)*t;//例子:求和 
	}

求值

  • 其中 \(k\) 指分块的个数, \(t_k\) 指第 \(k\) 个块的值(下同)

  • \[\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor=\sum_{k}(\frac{n}{l_k})\times (r_k-l_k+1) \]

  • \[\begin{aligned} &\sum_{i=1}^{n}n \% i \\ =&\sum_{i=1}^{n}(n-\left \lfloor \frac{n}{i} \right \rfloor \times i) \\ =&n^2-\sum_{k}t_k \sum_{i=l_k}^{r_k}i \\ \end{aligned} \]

    其中的 \(\sum_{i=l_k}^{r_k}i=\frac{(l_k+r_k)(r_k-l_k+1)}{2}\) (等差数列求和公式)

  • \[\begin{aligned} &\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor (n \% i) \\ =&\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor(n-\left \lfloor \frac{n}{i} \right \rfloor \times i) \\ =&n\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor -\sum_{k}t_k^2\sum_{i=l_k}^{r_k}i \\ \end{aligned} \]

应用

  • 杜教筛(今天没学,以后学了再来填坑)
  1. [CQOI2007]余数求和

    P2261 [CQOI2007]余数求和

    其实和求值2是一样的

    (因为变量名冲突所以这里用 \(k'\) 表示分块的个数)

    \[\begin{aligned} &\sum_{i=1}^{n}k \% i \\ =&\sum_{i=1}^{n}(k-\left \lfloor \frac{k}{i} \right \rfloor \times i) \\ =&n\times k-\sum_{k'}t_{k'} \sum_{i=l_{k'}}^{r_{k'}}i \\ \end{aligned} \]

    \(code\)

    signed main(){
    	read(n),read(k);
    	ans=n*k;
    	for(int l=1,r,t;l<=n;l=r+1){
    		t=k/l;
    		r=(k/l)?min(n,k/t):n;
    //		cout<<l<<" "<<r<<endl; 
    		ans-=(r-l+1)*((l+r)*t)/2;//注意 (l+r)*t的顺序!不然会爆零!因为下取整了! 
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
  2. 膜膜塔

    有题目没链接

    给定两个长度为 \(n\) 的数列 \(A,B\) ,求长度为 \(n\) 的数列 \(c\)\(n\le 10^5\)

    \[\begin{aligned} C_i &=\sum_{j=1}^i A_{\left \lfloor \frac{i}{j} \right \rfloor} B_{i \% j} \\ &=\sum_{j=1}^i A_{\left \lfloor \frac{i}{j} \right \rfloor} B_{i-\left \lfloor \frac{i}{j} \right \rfloor j} \\ &=\sum_k A_{t_k} \sum_{i=l_k}^{r_k}B_{i-t_k \times j} \\ \end{aligned} \]

    前一个求和号 \(O(\sqrt n)\) 求,后一个求和号 \(O(1)\)

    显然正常来说是做不到 \(O(1)\) 的,所以我们要想其他办法

    怎么能做到呢?显然 我们可以预处理

    (以下来自 \(Blueqwq\) )

    \(B\) 的下标 \(i-t_k\times j\) 中,\(i\) 不变,\(j\) 随枚举的区间而变且每次只变 \(1\) ,所以 \(B\) 在区间 \([l_k,r_k]\) 中每次只会减少 \(t_k\)\(t_k\) 的最大值只有 \(\sqrt n\)

    \(f_{i,j}\) 表示下标从 \(i\) 开始每次向前跳 \(j\) ,一直跳到下标为 \(i\mod j\) 的位置时 \(B\) 的前缀和(\(f_{i,j}\) 的大小为 \(n\sqrt n\)

    递推式:\(f_{i-j,j}=f_{i,j}+B_{i-j}\)

    枚举 \(k\) 后计算 \(\sum_{i=l_k}^{r_k}B_{i-t_k \times j}\) 时,只需用 \(f_{i-t_k \times l_k}-f_{i-t_k(r_k+1)}\) 即可实现 \(O(1)\) 查询

    总复杂度 \(O(n \sqrt n)\)

  3. 模积和

    P2260 [清华集训2012]模积和

    \(\sum_{i=1}^n\sum_{j=1}^m(n\%i)(m\%j) \ (i\not= j),n,m \le 10^9\)

    \[\begin{aligned} 原式&=\sum_{i=1}^n \sum_{j=1}^m (n-\left \lfloor \frac{n}{i} \right \rfloor i)(m-\left \lfloor \frac{m}{j} \right \rfloor j) -\sum_{i=1}^{min(n,m)}(n\%i)(m\%i)\\ &=\sum_{i=1}^n \sum_{j=1}^m(nm+\left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{j} \right \rfloor ij-n\left \lfloor \frac{m}{j} \right \rfloor j-m\left \lfloor \frac{n}{i} \right \rfloor i) -\sum_{i=1}^{min(n,m)}(n\%i)(m\%i) \\ &=\sum_{i=1}^n(n-\left \lfloor \frac{n}{i} \right \rfloor i)\sum_{j=1}^m(m-\left \lfloor \frac{m}{j} \right \rfloor j)-\sum_{i=1}^{min(n,m)}(nm+\left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{i} \right \rfloor i^2-(m\left \lfloor \frac{n}{i} \right \rfloor+n\left \lfloor \frac{m}{i} \right \rfloor)i) \\ \end{aligned} \]

欧拉函数求和

  • 前置知识

    欧拉函数:小于\(x\) 的整数中与 \(x\) 互质的数的个数,一般用 \(\varphi(x)\) 表示。特殊的, \(\varphi(1)=1\)

    计算欧拉函数通式:

    \[\varphi(x)=x\prod_{i=1}^{n} (1-\frac{1}{p_i}) \ (\varphi(1)=1) \]

    其中 \(p_1,p_2,...p_n\)\(x\) 的所有质因数,\(x\) 是正整数

  1. [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队

    \(\sum_{i=1}^n\sum_{j-1}^n[(i,j)=1],n\le 10^4\)

    \[\begin{cases} & ans(1)=0 \\ & ans(n)=2\sum_{i=0}^{n-1}\varphi (i)+1,n>1 \end{cases} \]

  2. [BZOJ2818]GCD

    P2568 GCD

    \(\sum_{i=1}^n\sum_{j=1}^n[(i,j)is \ prime],n\le10^7\)

    \[\begin{aligned} 原式&=\sum_p\sum_{i=1}^n\sum_{j=1}^n[(i,j)=p] \\ &=\sum_p\sum_{i=1}^{\left \lfloor \frac{n}{p} \right \rfloor }\sum_{j=1}^{\left \lfloor \frac{n}{p} \right \rfloor } [(i,j)=1] \\ &=\sum_p (2 \sum_{i=1}^{\left\lfloor\frac{n}{p}\right\rfloor}\varphi(i)-1) \end{aligned} \]

    然后用线性筛求欧拉函数前缀和即可

  3. P2398

    P2398 GCD SUM

    \(\sum_{i =1}^n\sum_{j =1}^n(i,j),n\le 10^5\)

    \[\begin{aligned} 原式&=\sum_dd\sum_{i=1}^n\sum_{j=1}^n[(i,j)=d] \\ &=\sum_d(2d\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor }\varphi(i)-1) \end{aligned} \]

  4. 上一道题的加强版

    这题8倍经验的说

    UVA11424 GCD - Extreme (I)

    UVA11426 拿行李(极限版) GCD - Extreme (II)

    UVA11417 GCD

    SPOJ3871

    P1390 公约数的和

    SP3871 GCDEX - GCD Extreme

    SP19985 GCDEX2 - GCD Extreme (hard)

    P2257 YY的GCD

    \(\sum_{i=1}^n\sum_{j=1}^{i-1}(i,j),n\le 10^6\) ,多组询问

    \[\begin{aligned} g(i)&=\sum_{j=1}^{i-1}\sum_{j=1}^{i-1}(i,j) \\ &=\sum_{d|i}\sum_{j=1}^{i-1}[(\frac{i}{d},\frac{j}{d})=1] \\ &=\sum_{d|i}\varphi(\left \lfloor \frac{i}{d} \right \rfloor ) \end{aligned} \]

    伪代码:

    for(int d=1;d<=n;++d){
        for(int i=d;i<=n;i+=d){
            g(i)+=phi(i/d);
        }
    }
    

    复杂度为调和级数:\(\sum_{1\le i \le n}\frac{n}{i}=O(\log n)\)

  5. 签到题

    P3601 签到题

    \(f(x)\) 表示 \([1,x]\) 内与 \(x\) 不互质的数的个数,求 \(\sum_{i=1}^rf(i)\% p\)\(r-l\le 10^6\)\(l,r \le 10^{12}\)

    \[f(x)=x-\varphi(x) \\ \varphi(x)=x\prod_{i=1}^{m}\frac{p_i-1}{p_i} \]

    对于每个数,考虑质因数分解,我们只需求出这个数有哪些质因子,然后暴力求 \(\varphi\) 即可

    \(10^{12}\) 当然是过不去的,事实上我们只筛 \(10^6\) 内的所有质数即可,从而得到 \(\sqrt n\) 以内的质因子。对于 \([10^6,10^{12}]\) 的数 \(x\) ,我们用刚才求的那些质因子一直除它,直到不能再整除为止。此时剩下的 \(>1\) 的数即为 \(>\sqrt x\) 的质因子,然后求 \(\varphi\) 即可

    伪代码:

    for(int j=1;j<=tot;j++){
        for(int i=(l/p[j])*p[j];i<=(r/p[j])*p[j];i+=p[j]){
            phi[i]*=((p[j]-1)/p[j]);
        }
    }
    
  6. 骗分过样例

    P5285 [十二省联考2019]骗分过样例

    区间筛法

    因为这题太毒瘤了所以跑去翻题解,结论大概是面向测试点编程

    并不在课件范围之内,不搞了不搞了qwq

  7. [SPOJ5971]LCM

    SP5971 LCMSUM - LCM Sum

    \(\sum_{i=1}^n[i,n],n\le 10^6\)多组询问\(T\le 3\times 10^5\)

    还是和之前一样推推推推推式子,过程就不放了这里放个化简结果吧 数学题的大部分意义不都在推式子的过程吗

    \[\sum_{i=1}^nlcm(i,n)=n\sum_{d|n}\sum_{i=1}^di[gcd(i,d)==1]=n\sum_{d|n}\frac{\varphi(d)d}{2} \]

组合计数

四大基本原理

  • 加法原理
  • 乘法原理
  • 减法原理(补集转化)
  • 除法原理(同构)(多用于群论中)

例题

  1. 不相交路径计数

    [BZOJ1471] 不相交路径

    补集转化,所有路径对数(拓扑排序)-相交路径对数

    本题题解来自@wsy_jim

    给定\(n\)个点的 DAG ,计数有序对\(a\rightarrow b,c\rightarrow d\)的数目

    • 满足路径\(a\rightarrow b,c\rightarrow d\)没有公共点

    • n ≤ 200, m ≤ 20000

    给出的图是DAG,我们可以通过拓扑排序在DAG上维护很多参量,这道题让求不相交的路径对数,我们可以记录下两个值,一个是f[i][j],表示从i到j共有多少条路径,另一个是g[i],表示有多少个点对(a,b)满足路径\(a\rightarrow i\)\(b\rightarrow i\)无交点

    利用乘法原理以及容斥原理可以推出DP式子:

    \[g[i]=f[a][i]*f[b][i]-\sum_{拓扑序在i之前的点j}g[j]*(f[j][i])^2 \]

    最后的答案就是

    \[ans=f[a][b]*f[c][d]-\sum g[j]*f[j][b]*f[j][d] \]

排列与组合

  1. 排列

\[P_n^m= \frac{n!}{(n-m)!} \]

  1. 圆排列

\[P_n^{m'}=\frac{n!}{(n-m)!m}=\frac{p_n^m}{m} \]

  1. 组合数

\[C_n^m=\frac{n!}{m!(n-m)!} \\ (可看做C_n^m=\frac{p_n^m}{m!}) \]

  • 通项公式和递推公式是组合数的两种基本求解方法,应根据数据范围选定方法
  1. 全错位排列

    使得对于任何 \(i\in [1,n]\) ,满足第 \(i\) 个位置上的数不是 \(i\) 的排列数

    \[D_1=0,D_2=1 \]

    \[D_n=(n-1)(D_{n-1}+D_{n-2}) \]

  2. 二项式定理

    \[(x+a)^n=\sum_{k=0}^{k}C_n^kx^ka^{n-k} \]

    • 试证明 \(\sum_{k=0}^nC_n^k=2^n\)
    • 性质:

    \[\sum_{i=0}^n(-1)^iC_n^i=0(奇数位的和=偶数位的和)\\ C_n^mC_m^r=C_n^rC_{n-r}^{m-r}\\ 递推公式:C_n^m=C_{n-1}^m+C_{n-1}^{m-1}(总=n不选+n选)\\ \]

例题

  1. 组合数问题

    P2822 [NOIP2016 提高组] 组合数问题

    就是板子,用杨辉三角预处理可过

Lucas定理

\[C_n^m\%p=C_{n/p}^{m/p}C_{n\%p}^{m\%p}\%p(p是质数) \]

扩展Lucas定理

\[C_n^m\%p=C_{n/p}^{m/p}C_{n\%p}^{m\%p}\%p(p不是质数) \]

统计分子分母里 \(p\) 出现的次数,然后用分子里的个数减去分母里的个数,如果 \(>0\) 那么 \(\%p\) 的结果为 \(0\)\(p\) 是组合数的因子)

例题

  1. 礼物

    P2183 [国家集训队]礼物

  2. [ARC117C]砖块

    C - Tricolor Pyramid

    • 由真值表推式子(本质就是打表找规律)

卡特兰数

卡特兰数是组合数学中一个常出现在各类计数问题中的数列

数列的前几项为:\(1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845,...\)

\[H_n=\frac{C_{2n}^n}{n+1} \]

证明:

\[C_{2n}^n-C_{2n}^{n-1}=C_{2n}^n-C_{2n}^n·\frac{n}{n+1}=C_{2n}^n·\frac{1}{n+1} \]

该证明也就是卡特兰数最常用的一个变形:

\[H_n=C_{2n}^n-C_{2n}^{n-1} \]

卡特兰数也有递推式:

\[H_n=\sum_{i=0}^{n-1}H_iH_{n-i-1} \]

  • 计数问题 \(or\) \(DP\)
  • 锻炼敏感度,看见出现了几项上述那些数就要考虑卡特兰数,看不出来可打表
  1. 折线/括号序列/01串

    就是从不同角度对卡特兰数的理解

    放一张课件上的图:

  2. \(n\) 个点二叉树划分

    \(n\) 个节点能构成几种不同的二叉树

    假设现在为中序遍历,根节点第 \(k\) 个被访问到,则根节点的左子树有 \(k-1\) 个节点,右子树有 \(n-k\) 个节点,\(1 \le k \le n\) ,容易发现这样的计算方法正好和卡特兰数的递推式一致,或者说递推式可又这种方法得到

  3. \(n+3\) 个点凸多边形三角剖分

    (图片来自网络)

    img

    \[H_n=\sum_{k=3}^{n-1}H_kH_{n-k+2} \]

例题

路径

P1641 [SCOI2010]生成字符串

\[C_{n+m}^n-C_{n+m}^{m-1} \]

斐波那契数列

  1. 性质

    • \(f_1+f_2+f_3+...+f_n=f_{n+2}-1\)
    • \(f_1^2+f_2^2+f_3^2+...+f_n^2=f_n f_{n+1}\)
    • \(f_1+f_3+f_5+...+f_{2n-1}=f_{2n}\)
    • \(f_2+f_4+f_6+...+f_{2n}=f_{2n+1}-1\)
    • \(f_n=f_mf_{n-m-1}+f_{m-1}f_{n-m}(n \ge m)\)
    • \(f_{n-1}f_{n+1}=f_n^2+(-1)^n\)
  2. 应用

    • 递推公式加速计算
    • 模质数循环节
  3. 斐波那契和 \(gcd\) 关系

    • \(gcd(fib(i),fib(j))=fib(gcd(i,j))\)
    • \(n|m \Leftrightarrow fib(n)|fib(m)\)

八类基本计数问题

  • 有无标号
  • 排列/组合
  • 是否重复
  1. 球同盒不同,不可空:\(C_{n-1}^{m-1}\)
  2. 球同盒不同,可空:\(C=_{n+m-1}^{m-1}\)
  3. 球不同盒同,不可空:(第二类斯特林数)$f[i][j]=j*f[i-1][j]+f[i-1][j-1] $
  4. 球不同盒同,可空:\(\sum_{i=1}^{m}S[n][i]\)
  5. 球不同盒不同,不可空: \(S[n][m]*m!\)
  6. 球不同盒不同,可空:\(m^n\)
  7. 球同盒同,不可空:\(f[n][m]=f[n-1][m-1]+f[n-m][m]\)
  8. 球同盒同,可空:球少:\(f[i][j]=f[i][i]\) 球多:\(f[i][j]=f[i-1][j]+f[i][j-1]\)

斯特林数

第一类斯特林数

\(n\) 个数划分为 \(m\) 个圆排列的方案数

\[S_{1_{n,m}}=S_{1_{n-1,m-1}}+(n-1)S_{1_{n-1,m}} \]

第二类斯特林数

\(n\) 个数划分为 \(m\) 个集合的方案数

\[S_{2_{n,m}}=S_{2_{n-1,m-1}}+m\times S_{2_{n-1,m}} \]

例题

楼房

[HDU4372]Count the Buildings

按照最高点分为左右两部分,左边能看到 \(f\) 栋,右边能看到 \(b\) 求出第一类斯特林数 \(S_{n-1,f-1+b-1}\) ,即把除最高楼之外的楼排成 \(f-1+b-1\) 个圈。分好组后,直接从 \(f+b-2\) 个组中选出 \(f-1\) 组放左边,共有 \(C_{f+b-2}^{f-1}\) 种选择。

由乘法原理可得,共有 \(S_{n-1,f-1+b-1} \times C_{f+b-2}^{f-1}\) 种方案数

注意,当 \(n-1<f+b-2\) 时无解,输出 \(0\)

概率 期望

古典概型

离散的

\[\sum_{i-1}^{n}p[i]=1 \]

几何概型

连续的

\[\int p[i]=1 \]

加法原理&乘法原理

独立事件:

\[p[i \land j]=p[i] \times p[j] \]

并列事件:

\[p[i\vee j]=p[i]+p[j]-p[i\land j] \]

条件概率

当事件 \(j\) 已经发生时,事件 \(i\) 发生的概率:

\[P[i|j]=\frac{p[i \land j]}{p[j]} \]

  1. 当太阳已经从东边升起 \(n\) 次后,求第 \(n+1\) 次从东边升起的概率

    \[P(n)=\frac{n+1}{n+2} \]

  2. 三门问题

    有三道题 \(A,B,C\) ,分别为两个水题和一个神题,已经随便选了一道题,又已知另外两个里面的某一个是水题,现想要切到神题,问应不应该用手里的这道换剩下的那道?

    答:应该。不换能赢的概率是 \(\frac{1}{3}\) ,换了能赢的概率是 \(\frac{2}{3}\)

    证明见这里

  3. 扩展三门问题

    [UVA10491] 奶牛和轿车 Cows and Cars

    \(A\) 个水题,\(B\) 个神题,做完决策后告诉你 \(C\) 个水题的情况,求换/不换时切到神题的概率 \((C<A)\)

    \[神题\left\{\begin{matrix} 水题\to \frac{A}{A+B}·\frac{B}{A+B-C-1} \\ 神题 \to \frac{B}{A+B}·\frac{B-1}{A+B-C-1} \end{matrix}\right. \]

    因为上面这两种情况为并列事件,所以把它们相加就是答案

    \[ans=\frac{AB+B^2-B}{(A+B)(A+B-C-1)} \]

期望

线性性质

\(x_i\) 表示事件 \(i\) 的权重

则可以得到

\[E(x)=\sum_{i=1}^np_i\times x_i \\ E(ax+b)=aE(x)+b \\ E(ax+by)=E(ax)+E(by) \]

例题

  1. 骗分

    P1297 [国家集训队]单选错位

  2. Kids and Prizes

    [SGU495]Kids and Prizes(带程序)

  3. 进场

    [CF518D] Ilya and Escalator

  4. 翻牌

    [BZOJ1419]Red is good

  5. DEBUG

    [POJ2096]Collecting Bugs

    ①顺推:4种状态, \(O(n^2) \ DP\) ②逆推:4种状态倒过来

  6. 增长

    [CCPC 2019]Harbin K. Keeping Rabbits

  7. 摇奖

    均摊复杂度 \(O(1)\)

  8. 粒子加速器

    [ICPC2020]Macau A. Accelerator

  9. 石头剪刀布

    [CF540D] Bad Luck Island

  10. 期望树

    (JZOJ):①线段树维护区间或(暴力改,不用打标记) ②线段树询问区间和 ③期望,拆开算,补式子(区间和的平方!)

  11. 猫和老鼠

    P4206 [NOI2005] 聪聪与可可

    • 稀疏图(点边同一级别的,此时可认为入队次数不会超过10)用SPFA不会被卡,但是相差超过10倍就最好别用
    • 逆推 不是直接从终态找到初态 是在搜索过程中记忆化搜索找到终态
    • 记搜+SPFA
  • 期望的例题共11道,实在写不动了qwq,改天再补吧

    不咕不咕不咕!!!

posted @ 2021-07-08 20:43  DReamLion  阅读(204)  评论(1编辑  收藏  举报