基础算法
文章平均质量分 66
计划把XCPC基础算法全整理一遍,太抽象或者不明确的如贪心这种就不整理了,难度预计也就是铜牌等级吧
花落的那一天
这个作者很懒,什么都没留下…
展开
-
KMP字符串匹配
KMP算法是用来快速进行字符串匹配的,可以找出一个字符串在另一个字符串中出现的位置和次数等有关问题。基本思想就是先对其中要找的那个子串进行匹配—记录每一个位置当在这个位置匹配的时候出现了问题应该从哪个地方重新开始匹配。举个栗子吧如下两个字符串字符串从下标1开始s1 = abcabcabcabcds2 = abcabcd当我们要进行暴力匹配的时候,s2字符串匹配到d时,s1为a,此时匹配出现了问题,要重新从上次匹配s1的位置的下一个位置来进行匹配,这时会非常浪费时间,效率太低了。而我们观察可原创 2022-04-05 19:52:08 · 290 阅读 · 0 评论 -
矩阵快速幂
本文只做基础入门,了解矩阵快速幂的基础应用。进阶内容可以去看其他dalao的~~矩阵乘法矩阵乘法设A=(aij)是一个m×x矩阵,B=(bij)是一个s×n矩阵,那么规定矩阵A和矩阵B的乘积是一个m×n矩阵C=(cij)设A=(a_{ij})是一个m×x矩阵,B=(b_{ij})是一个s×n矩阵,那么规定矩阵A和矩阵B的乘积是一个m×n矩阵C=(c_{ij})设A=(aij)是一个m×x矩阵,B=(bij)是一个s×n矩阵,那么规定矩阵A和矩阵B的乘积是一个m×n矩阵C=(cij)(a11原创 2022-04-05 09:13:58 · 186 阅读 · 0 评论 -
快速幂简单理解和模板
快速幂的主要思想就是将指数看做二进制的形式,从低位到高位进行判断,如果这一位是1,那么就要乘上指数的X次方。例如3103101021∗32∗383^{10} \\3^{1010_2} \\1 * 3^2 * 3^83103101021∗32∗38C++int ksm(int a, int b, int mod){ int res = 1; while (b) { if (b & 1) res = (res * a) % mod;原创 2022-04-05 09:03:06 · 887 阅读 · 0 评论 -
整除分块(数论分块)
整除分块众所周知,在int的世界中,除法都是下取整的,那么当一个数除以其他的数的时候,会出现结果相同的情况,在计算有关一个数被一个区间处理的问题中,就可以利用这个性质。例如,求数n分别除以1-n中所有数的和。C++#include <iostream>using namespace std;typedef long long ll;ll n, ans;int main(){ cin >> n; for (int l = 1, r; l <= n; l原创 2022-04-03 10:59:51 · 521 阅读 · 0 评论 -
费马定理与欧拉定理
费马定理在数论中推理其他结论还是会经常用到了,欧拉定理可以单独出题。欧拉定理其实也算是包含了费马定理,或者说费马定理是欧拉定理中的一种特殊情况。费马小定理设p是素数,a是任意整数且a≡0(mod p), 则ap−1≡1(mod p)设p是素数,a是任意整数且a\equiv0(mod\ \ p),\ \ 则\\a^{p-1}\equiv 1 (mod\ \ p)设p是素数,a是任意整数且a≡0(mod p),&原创 2022-04-02 21:23:02 · 1299 阅读 · 0 评论 -
扩展欧几里得算法
欧几里得算法欧几里得算法又称为辗转相除法,是用来计算两个非负整数a,b的最大公约数的。实现方式也非常简单C++int gcd(int a, int b){ if (b) return gcd(b, a % b); return a;}扩展欧几里得算法顾名思义,扩展欧几里得算法就是欧几里得算法的扩展版扩展欧几里得算法是用来解决一个很简单的问题。对于一对正整数a, b求出一组x, y满足ai∗xi+bi∗yi=gcd(ai,bi)a_i * x_i + b_i * y_原创 2022-04-02 16:33:04 · 869 阅读 · 0 评论 -
快速幂求逆元—逆元求解的证明以及理解
简单理解求逆元首先要有两个数,a、p,求解a % p的乘法逆元,设a % p = b,那么就是求b的乘法逆元。首先要说的是,当a % p == 0的时候,就没有乘法逆元了。假设b的乘法逆元是b^-1求出的乘法逆元有个主要的性质就是b∗b−1%p=1b * b^{-1} \% p = 1b∗b−1%p=1求逆元给定b、m,其中m为质数,求b模m的乘法逆元对于任意整数 a, 满足b|a(b整除a),设存在整数一个x,满足a/b≡a∗x(mod m)a/b\equiv原创 2022-04-02 14:03:32 · 1134 阅读 · 0 评论 -
逆序对的数量—归并排序和树状数组
逆序对就是数组中的两个数,下标小的那个数的值大于下标大的那个数。这就是一组逆序对。5 4 3 2 1像这组数据,一共有4 + 3 + 2 + 1个逆序对。主要有两种求解方式,归并排序和树状数组。归并排序众所周知,归并排序是通过将一个数组分为两部分,分别进行排序然后合并。在合并的时候会对两组数据进行比对,那么此时如果右边那一组的数据小于左边当前判断的这个数据,那么左边这组数据中后面的数据都能与右边当前判断的数据组成逆序对。如图为归并排序中的一个过程a: 1 6 7 8 9 b: 2 3原创 2022-04-01 18:13:00 · 467 阅读 · 0 评论