学习历程
记录我的学习历程
【杰杰】
这个作者很懒,什么都没留下…
展开
-
数论刷题计划
约数之和因式分解然后用乘法原理表示出答案,再用等比求和公式求解。原创 2021-12-14 00:31:40 · 829 阅读 · 0 评论 -
P1495 【模板】中国剩余定理(CRT)/曹冲养猪+中国剩余定理讲解
传送门借此题复习一下中国剩余定理。题意:此题可简化成求同余方程的解(a1...an互质a_1...a_n互质a1...an互质):x mod a1=b1x\ mod\ a_1=b_1x mod a1=b1x mod a2=b2x\ mod\ a_2=b_2x mod a2=b2x mod a3=b3x\ mod\ a_3=b_3x mod a3=b3…x&原创 2021-12-26 21:22:24 · 1402 阅读 · 0 评论 -
stein求gcd
于欧几里得算法的对比与欧几里得求gcd相比,stein算法的优势在于稳定,欧几里得算法中存在取模运算,而当模数过大时,取模运算的耗时会增加,而stein算法中只涉及移位,速度超快!原理gcd(ka,kb)=k*gcd(a,b)实现int stein(int a,int b){ if(a<b)a^=b,b^=a,a^=b;//交换 if(!b)return a; if((!(a&1)) && (!(b&1)))return stein(a>>原创 2021-12-17 23:46:31 · 180 阅读 · 0 评论 -
斯特林数。
第一类斯特林数第一类斯特林数s1s_1s1(n,m)表示的是将n个不同的元素构成m个圆排列的数目。考虑递推,可以将s1s_1s1(n,m)分为两种情况:1.某一个元素单独构成一个圆,其它的n-1个元素构成m-1个圆,则这种情况下的数目为:n*s1s_1s1(n-1,m-1)。2.某一个元素和至少1个其它元素构成一个圆,将n-1个元素组成m个圆,再将剩下的一个元素放入任何一个圆里,则这种情况下的数目为:(n-1)*s1s_1s1(n-1,m)所以:s1(n,m)=n∗s1(n−1,m−1原创 2021-08-23 17:03:40 · 87 阅读 · 0 评论 -
扩展欧几里得
若a,b是整数,那么对于任意整数x,y,ax+by是gcd(a,b)的倍数,且一定存在x,y使得ax+by=gcd(a,b)成立。原创 2021-08-20 18:02:31 · 152 阅读 · 0 评论 -
分块算法.
分块算法用于解决区间的查询问题。分块算法,故名思意,就是把一个数组分为长度为n\sqrt{n}n的数个小块,对每个小块进行单独的维护。需要用到的数组有:ll st[1000100],ed[1000100],a[1000100];ll sum[1000100],add[1000100],pos[1000100];以上数组从上往下从左到右依次为:每一个区块在a中的的首下标和末下标,原数组a;更改之后的第i个块的总值,对整个块进行更新的值,a中每一个元素所在的块的标号。(具体作用会在下面解释)在开原创 2021-08-05 00:14:30 · 209 阅读 · 0 评论 -
树状数组求逆序对
每次按顺序将序列依次加入树状数组d[x]中,d[x]表示当前1到x中有多少数出现,每次加入的时候判断已有的比加入的数大的数。添加:因为数x会对比它小的数做出贡献,因而应该往下更改树状数组。void add(int x){ while(x >= 1) { d[x]++; x -= lowbit(x); }}查询从数x开始一直网上累加,算出当前已有的数中比x-1大的数的个数。int ask(int x){ int ans = 0; while(x <= n)原创 2021-08-03 00:31:32 · 93 阅读 · 0 评论 -
邻接表(数组)
概要相比于二维数组存储,邻接表占有更小的空间,且在遍历时具有较小的时间复杂度。int g[n][n];//二维数组存储在保证不超限的情况下,也可以用这种方式存图:struct node{ int num[n];//该边通向的边的编号 int cnt;//该边通向的边数量}g[n];//边的编号邻接表存储看过许多篇博客都是用指针存储,但奈何本人不怎么喜欢指针这东西(其实是我不会 ),所以就学习了用数组来模拟邻接表的存储。首先我们需要建立一个结构体用来保存每一条边struct no原创 2021-05-27 00:02:50 · 946 阅读 · 1 评论 -
拓补排序
概要在一个有向无环图中,对其所有顶点进行拓补排序,就是将所有顶点排成一个序列,并使得序列中所有的点满足对于边<u,v>,若u到v是可达的,则u在拓补序列中一定出现在v之前。过程①找到当前入度为0的点,加入拓补序列②将找到的入度为0的点的出边和该点删除③重复上面两个步骤简要实现图的存储方式不止一种使用数组f[]储存每个点地入度;将入度为0地点放入栈或者队列中;每次删除要使对应被删除的边地入度减一;最后当所有的点都已经删除则拓补排序完成,同时,栈或队列为空,若不为空,则说明图原创 2021-05-24 21:51:01 · 239 阅读 · 0 评论 -
Kruskal算法
简介该算法利用贪心的思想选择当前权值最小的一条边,作为最小生成树的一部分,并利用并查集来判断当前的选择是否会导致“环”的出现。代码流程首先需要用结构体储存一条边的两个端点的编号及其权值,同时我们需要用优先队列按边的权值大小排序储存每一条边。struct node{ int x,y;//边的两个端点的编号 int t;//边的权值 friend bool operator < (node a, node b) { return a.t > b.t; }//按照边的权值排序}原创 2021-05-01 20:53:23 · 76 阅读 · 0 评论 -
LCM与GCD
求GCD常用辗转相除法(欧几里得算法)①例如求gcd(12, 18): 先用12 % 18 == 12;②再用上一轮模数(18)模上上一轮取模的结果(12):18 % 12== 6;③再用上一轮的模数(12)模上上一轮取模的结果(6):12 % 6 == 0;④发现结果等于0了,这时候的模数(6)就是最后的答案。以下是gcd代码:int gcd(int a,int b){ if(b == 0) return a; else return gcd(b,a%b);}algorith原创 2021-03-03 15:17:24 · 252 阅读 · 1 评论 -
并查集
以下完全是个人理解,慎看概念(摘自百度百科)并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。原创 2021-02-27 23:30:08 · 124 阅读 · 0 评论 -
组合数取模(费马小定理)
假设求Cnk对mod取模的结果,可以用逆元+费马小定理来求。公式当mod为素数时n/m%mod=(n*m^(mod-2))%mod使用时,一般和快速幂结合食用。原创 2021-02-01 20:09:21 · 163 阅读 · 0 评论 -
快速幂取模
快速幂取模第一周学习内容:1、 快速幂学习时间:2020.11.15----2020.11.21# 二、快速幂取模1.快速幂朴素的pow的时间复杂度是O(n),而快速幂的时间复杂度为O(logn),因此,在必要情况下,我们可以通过快速幂来降低时间复杂度,从而达到优化程序的目的。快速幂代码如下:int pow(int a,int b){ int ans=1; int sum=a; while(b) { if(b%2==1) sum*=a; b/=..原创 2020-11-22 00:00:43 · 112 阅读 · 0 评论 -
前缀和+桶+map
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、例如:代码如下前言当我们想对前缀和进行标记的时候,有for和桶两种方法,若使用for就得嵌套,达到O(n^2)的时间复杂度,在部分题目当中,很可能会超时。于是,我们便想到了用超快的桶排来进行标记,但桶排也是有局限性的,又大又多的数据很可能使所要标记的数超过数组的最大长度,这个时候,map便能解决这个关键性的问题。一、例如:描述那是另一个世界,那个世界里的老人们常常说天圆地方,在夜晚天空中散落着很多的星星。在这些原创 2020-11-22 21:40:00 · 150 阅读 · 0 评论 -
结构体排序-2020--11--29
文章目录一、使用步骤1.先定义结构体数组2.写排序函数3.排序一、使用步骤1.先定义结构体数组struct stu{ string id; int score;}stus[1010];2.写排序函数由大到小或由小到大代码如下:bool cmp(stu a,stu b){ return a.score>a.score;}3.排序在main函数中,使用sort(某些题目可能需要用到stable_sort)sort(stus,stus+n,cmp);当使用sta..原创 2020-11-29 16:45:51 · 92 阅读 · 0 评论 -
getline()的使用--2020--11--29
文章目录前言一、getline()1.使用格式前言当需要输入一串带有空格的字符串时,便可使用 getline()。头文件为#include。一、getline()1.使用格式getline(输入流,字符串名称,截至符号)特别的,若是不输入截至符号,则默认以‘\n’结束。例如:getline(cin,str,’\n’)...原创 2020-11-29 16:54:58 · 199 阅读 · 0 评论 -
二分梳理
文章目录前言一、二分适用的情况二、二分的一般流程三、整数二分1.需要注意的2.例题四、浮点数二分1.需要注意的地方例题前言这周学习了二分,借此篇博客来复习并梳理二分的内容。一、二分适用的情况大多数要用到二分的题一般都有以下特点:1.数据单调2.需要在单调的数据中找到某一个符合条件的数二、二分的一般流程1.确定二分的对象2.确定二分的边界3.编写check函数或者说判断左右区间更新的条件三、整数二分1.需要注意的出循环的时候,因为是l==r,所以两者皆可。2.例题..原创 2020-12-05 22:58:36 · 89 阅读 · 0 评论 -
bfs超!超!超!详细步骤梳理!!!
简介我个人理解的是bfs就是自当前一点,逐渐地向外扩张,有种水漫金山的感觉。也可以说是枚举每一个正确点的”未来的“可能性。例如:在第一个二维的地图中,题目要求我们从起点开始搜索终点的位置。1.将起点放入队列;2.取出队列中的第一个数(当前取出的是起点),看其邻近的点是否符合要求,若符合,则将其放入队列;3.将队列中的点依次取出,对于每一个点,都重复2的步骤;4.判断当前点是否为终点;以上只是一个大致的步骤,在不同的题目中,可能需要做出相应的修改。同时,bfs的模板可能在一些小的方面会有不原创 2020-12-12 23:18:52 · 674 阅读 · 0 评论