第四章 数学知识
分享关于acwing算法基础课的关于数学方面的题解报告
MangataTS
一个爱折腾的Coder
展开
-
AcWing 894. 拆分-Nim游戏
题目链接 https://www.acwing.com/problem/content/description/896/ 思路 注意题意是:从这么多堆中拿走一堆,然后加上两堆较小(不一定相同)的石子那么最后一定是能将所有的石子全部变为0的,这也是该游戏的必败态 对于每一个数量不同的石子我们就可以将其看作为一个SGSGSG局面,对于每一个局面我们可以将其分成两个小于当前局面的局面,假设当前局面数量为x,那么SG(X)=SG(i)SG(j)SG(X) = SG(i) ^ SG(j)SG(X)=SG(i)SG(j原创 2022-02-16 21:03:36 · 911 阅读 · 0 评论 -
AcWing 893. 集合-Nim游戏(SG函数)
题目链接 https://www.acwing.com/problem/content/895/ 思路 因为博弈的过程是一个状态交替的过程,而SG函数就是记录每一个状态交替的过程,从终点的必败态往前推,退出开始的状态(因为玩家都足够聪明),那么对于n堆的情况,其实和开始的nim也是一样的,我们需要求出每一堆的初始状态,然后异或起来如果不为0那么说明先手可以将当前的状态变为必败态,否则先手就是必败态,那么我们通过SG函数就能求得这个信息 代码 #include<bits/stdc++.h> usi原创 2022-02-16 18:38:52 · 607 阅读 · 0 评论 -
AcWing 892. 台阶-Nim游戏(nim博弈变种)
题目链接 https://www.acwing.com/problem/content/description/894/ 思路 先说结论:我们将奇数位置上的石子数异或起来如果不为0则先手必胜 原理: 假设我们奇数位置上的数全部异或起来为0,那么此时的局面可以看成奇数位置上的数全为0,那么对于偶数位置上的数来说想要全部移动到地面需要偶数次操作,也就是说此时的先手必败,那么对于奇数位置上异或起来不全部为0呢,我们先手可以进行一个移动操作,使得奇数位置上所有的数异或起来为0,也就是将必败态丢给了后手,后面后手做什原创 2022-02-16 18:36:17 · 993 阅读 · 0 评论 -
AcWing 891. Nim游戏(nim博弈)
题目链接 https://www.acwing.com/problem/content/893/ 思路 这个题目需要清楚一个概念: 必胜态:我们能通过一个操作使得局面变成必败态 必败态:无论如何操作都不能变成必胜态 如果当前的石子堆的数量都是成对出现的,那么一定是必败态,因为此时先手无论如何操作,后手都能做一个镜像的操作,最后先手就不能进行操作,所以此时先手必败,然后我们也知道全0也是必败态,我们其实可以从结果反推到我们开始的状态,如果当前的局面为成对出现那么此时的局面就是必败态,否则为必胜态,所以我们原创 2022-02-16 18:29:46 · 957 阅读 · 0 评论 -
AcWing 890. 能被整除的数(容斥原理)
题目链接 https://www.acwing.com/problem/content/892/ 思路 我们可以直接通过除法来计算每一个质数的倍数有多少个,但是这样的话可能会出现重复计算的情况,例如6是2,3的倍数,所以如果我们的n大于等于6的时候会将这个计算两次,那么我们可以通过容斥原理来计算这个整个集合的数量,我们可以通过二进制枚举或者dfs来枚举我们当前选择的集合(0个数不能算作集合,并且超过n的数也不能算在集合内) 容斥原理的思想:∣S1∣+∣S2∣+∣S3∣−∣S1S2∣−∣S1S3∣−∣S2S3原创 2022-02-16 18:28:45 · 344 阅读 · 0 评论 -
AcWing 889. 满足条件的01序列(卡特兰数)
题目连接 https://www.acwing.com/problem/content/891/ 思路 因为有n个1和n个0,那么最后一定能走到点(n,n),我们正面去想不太好想,所以我们可以看看中间出现1的数量比0多的情况,对于这个放法我们可以化成一个平面图,1表示向右走一步,0表示向上走一步,那么对于我们现在要求的反面就是要经过y=x+1y=x+1y=x+1这一条线的方案数,我们可以对这条线做(n,n)的一个对称图形也就是(n-1,n+1),我们会发现这个一个位置的方案数为:C2nn−1C_{2n}^{原创 2022-02-15 21:11:16 · 211 阅读 · 0 评论 -
AcWing 888. 求组合数 IV(高精度求组合数问题)
题面连接 https://www.acwing.com/problem/content/890/ 思路 因为要用到高精度,那我们直接使用python就好,如果不使用python,那么我们可以将a!a!a!和b!b!b!进行一个质因子拆分操作,最后再使用高精度乘法将这些质数的质因子质数的值全部乘上就好 代码 python import math a,b=map(int,input().split()); b=max(b,a-b); ans=1; for i in range(a-b+1,a+1): a原创 2022-02-15 21:06:45 · 527 阅读 · 0 评论 -
AcWing 887. 求组合数 III(Lucas定理)
题面连接 https://www.acwing.com/problem/content/description/889/ 思路 我们会发现我们的模数要远小于我们要求得组合数,并且模数p是一个质数,那么我们就可以使用lucas定理来帮我们快速求解次问题,Lucas定理:Cab mod p=Ca mod pb mod p×lucas(a/p,b/p) mod pC_a ^b \ mod\ p = C_{a \ mod \ p} ^原创 2022-02-15 21:06:08 · 337 阅读 · 0 评论 -
AcWing 886. 求组合数 II(预处理阶乘)
题目链接 https://www.acwing.com/problem/content/description/888/ 思路 这一个数据范围更加大,那么我们此时用递推式肯定是不行了,因为存不下,二来是复杂度太高,所以我们可以从组合数的定义出发:Cab=a!(a−b)!×b!C_a^b=\frac{a!}{(a-b)!\times b!}Cab=(a−b)!×b!a!,那么我们现在只需要将1e5以内的所有阶乘和阶乘的逆预处理出来就好啦,所以这个问题也就解决了 代码 #include<bits/st原创 2022-02-15 21:02:49 · 325 阅读 · 0 评论 -
AcWing 885. 求组合数 I(递推式预处理)
题面连接 https://www.acwing.com/problem/content/887/ 思路 通过组合数学的知识我们能知道Cab=Ca−1b+Ca−1b−1C_a^b = C_{a-1}^b + C_{a-1}^{b-1}Cab=Ca−1b+Ca−1b−1的,等式的右边表示的是从a−1a-1a−1个数中选取b−1b-1b−1个数以及从a−1a-1a−1个数中选取bbb个数的情况,分别对应了当前第bbb个数选择和不选择的情况(好像和背包的思想有点相似),然后我们就能通过递推式来求得2000以内原创 2022-02-15 21:01:50 · 199 阅读 · 0 评论 -
AcWing 884. 高斯消元解异或线性方程组
题目连接 https://www.acwing.com/problem/content/886/ 思路 和浮点高斯消元类似的,步骤也是相同的,不过我们这里的运算操作变成了异或操作,对于我们枚举到的第r行,第c列我们希望能将下面[r+1,n)行的第c位全部置为0,其实这和普通的高斯消元并无两样 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long原创 2022-02-15 21:00:44 · 217 阅读 · 0 评论 -
表达整数的奇怪方式(拓展中国剩余定理)
题目链接 https://www.acwing.com/problem/content/description/206/ 思路 对于这个问题,我们要求解n个满足条件的方程,我们首先考虑满足两个方程的情况: X≡m1 mod a1X≡m_1 \ mod \ a_1X≡m1 mod a1 X≡m2 mod a2X≡m_2 \ mod \ a_2X≡m2 mod a2 这个方程也能写成如下格式,假设一任意整数kik_iki原创 2022-02-14 14:41:23 · 268 阅读 · 0 评论 -
高斯消元解线性方程组(浮点高斯消元模板)
题目连接 https://www.acwing.com/problem/content/885/ 思路 高斯消元的思路如下: 1.我们从上到下,从左到右开始消元,对于每一行我们只保留当前[i,i]行的值为1,这样就是一个阶梯型的 2.由于是从上往下的,所以我们每一次开始消元的时候先选取绝对值最大的当前这一列的值的位置,然后将这一行与我们处理到的最上面的一行进行数据交换 3.将我们当前处理的第r行的第c列系数变为1方便后面消元,对于这一步我们用的是初等变换中的等式两边同时乘上一个数 4.我们将当前第r行下面原创 2022-02-14 21:38:21 · 335 阅读 · 0 评论 -
AcWing 878. 线性同余方程(拓展欧几里得)
题目链接 https://www.acwing.com/problem/content/880/ 思路 ai×xi≡bi(modmi)a_i\times x_i≡b_i(mod \\ m_i)ai×xi≡bi(modmi)我们可以将右边变一下形,ai×xi≡ci×mi+bi(modmi)a_i\times x_i≡c_i \times m_i + b_i(mod \\ m_i)ai×xi≡ci×mi+bi(modmi) 然后移向过来就是个一个贝祖定理的形式了ai×xi+ci×mi≡bi(原创 2022-02-12 15:06:27 · 250 阅读 · 0 评论 -
AcWing 877. 扩展欧几里得算法(拓展欧几里得模板)
题目链接 https://www.acwing.com/problem/content/879/ 思路 由贝祖定理我们可以得到ax+by=k∗gcd(a,b)ax+by=k*gcd(a,b)ax+by=k∗gcd(a,b)一定存在,那么我们通过欧几里得算法进行递归运算,详情请看这边博客: https://acmer.blog.csdn.net/article/details/122280910 代码 #include<bits/stdc++.h> using namespace std; #de原创 2022-02-12 15:05:49 · 433 阅读 · 0 评论 -
AcWing 876. 快速幂求逆元
题目链接 https://www.acwing.com/problem/content/878/ 思路 通过费马小定理可以计算当a和p互质的情况,由于题目说明了p一定是质数,那么我们只用关系a是否是p的倍数即可,如果是p的倍数,那么我们就不能求得逆元,否则我们可以通过快速幂求得逆元 代码 #include<bits/stdc++.h> using namespace std; #define ll long long ll ksm(ll a,ll b,ll p){ ll res =原创 2022-02-12 14:59:09 · 161 阅读 · 0 评论 -
AcWing 875. 快速幂
题目链接 https://www.acwing.com/problem/content/877/ 思路 思路大概就是幂数转化为二进制,然后我们用一个变量记录累乘的结果,然后位权为1的时候我们就将ans更新即可,详情可以看我这一篇博客:https://acmer.blog.csdn.net/article/details/122280910 代码 #include <bits/stdc++.h> using namespace std; #define ll long long int n; l原创 2022-02-12 14:58:39 · 163 阅读 · 0 评论 -
AcWing 874. 筛法求欧拉函数(欧拉函数)
题目链接 https://www.acwing.com/problem/content/876/ 思路 对于一个数x如果是质数,那么它的欧拉函数就为x−1x-1x−1,对于其他合数我们可以将其拆成最小的质数的积,那么这个过程我们就可以通过欧拉筛法来计算欧拉函数值,现在我们还有两种情况需要讨论 如果i能整除prime[j]说明prime[j]是i的一个质因子,那么对于i*prime[j]来说其实就是phi[i]∗prime[j]phi[i] * prime[j]phi[i]∗prime[j] 如果i不能整除原创 2022-02-12 14:57:52 · 235 阅读 · 0 评论 -
AcWing 873. 欧拉函数(单个欧拉模板)
题目链接 https://www.acwing.com/problem/content/875/ 思路 我们可以通过容斥原理得到一个计算欧拉函数的公式: φ(n)=φ(p1a1)∗…∗φ(paax)φ(n)=φ(p_1^{a_1})∗…∗φ(p_a^{a_x})φ(n)=φ(p1a1)∗…∗φ(paax) =(p1a1−p1a1−1)∗…∗(pxax−pxax−1)=(p_1^{a_1}−p_1^{a_1−1})∗…∗(p_x^{a_x}−p_x^{a_x−1})=(p1a1−p1a1−1)原创 2022-02-12 14:57:08 · 191 阅读 · 0 评论 -
AcWing 871. 约数之和(唯一分解定理+组合数)
题目连接 https://www.acwing.com/problem/content/description/873/ 思路 如果n可以写成f(n)=a1α1×a2α2……×akαkf(n)=a_1^{α_1}\times a_2^{α_2}……\times a_k^{α_k}f(n)=a1α1×a2α2……×akαk(a1,a2,……,aka_1,a_2,……,a_ka1,a2,……,ak均为质数) 那么n的约数的和为: sum=(a10+a11+a12+……a1α1)×(a20+a2原创 2022-02-12 14:56:00 · 295 阅读 · 0 评论 -
AcWing 870. 约数个数(唯一分解+组合数)
题目链接 https://www.acwing.com/problem/content/872/ 思路 我们将每一个数进行一个唯一分解后,对于每一个质因子我们统计一下数量,假设我们已经记录到了每一个质因子的数量vis[x]vis[x]vis[x]那么我们选择的情况就是从000到vis[x]vis[x]vis[x]也就是vis[x]+1vis[x]+1vis[x]+1的选择方法,我们将所有的方法数乘起来 代码 #include <bits/stdc++.h> using namespace std原创 2022-02-12 14:55:14 · 223 阅读 · 0 评论 -
AcWing 869. 试除法求约数(枚举)
题目连接 https://www.acwing.com/problem/content/871/ 思路 就是我们从1枚举到(n)\sqrt(n)(n)如果能整除我们就放进map容器中最后遍历容器就好了 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #define endl "\n原创 2022-02-12 14:54:35 · 154 阅读 · 0 评论 -
AcWing 868. 筛质数(欧拉筛模板)
题目连接 https://www.acwing.com/problem/content/870/ 思路 欧拉筛模板,学习链接:https://acmer.blog.csdn.net/article/details/122280910 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #define mod 1000000007 #原创 2022-02-12 14:54:04 · 202 阅读 · 0 评论 -
AcWing 867. 分解质因数(唯一分解定理)
题目连接 https://www.acwing.com/problem/content/description/869/ 思路 唯一分解定理,因为每一个数都能唯一的拆分成最小质因子的积的形式,所以我们从2开始枚举因子,如果出现了因子我们就将这个因子枚举完即可,详情请看代码 代码 #include<bits/stdc++.h> using namespace std; //----------------自定义部分---------------- #define ll long long #def原创 2022-02-12 14:53:31 · 344 阅读 · 0 评论 -
AcWing 866. 试除法判定质数(素数判定)
题目连接 https://www.acwing.com/problem/content/description/868/ 思路 对于一个数来说我们判断其是否有除1和本身外的因子实际上只需要从[2,x][2,\sqrt{x}][2,x]即可,因为因子是对称的例如6来说当我们枚举到2的时候就不必枚举3了,因为已知一个因子2,那么另一个因子必然为3,所以这就是试除法判定质数的思路和原理 代码 #include<bits/stdc++.h> using namespace std; #define l原创 2022-02-12 14:52:56 · 272 阅读 · 0 评论