- 博客(102)
- 问答 (1)
- 收藏
- 关注
原创 求逆的三种方式
费马小定理求amodba mod bamodb的逆运算,得到的是,当a与b是互相逆的情况下,得到的是ap−1a^{p-1}ap−1欧拉公式Φ(n)为在n内和与n互质的数的个数\Phi(n) 为在n内和与n互质的数的个数Φ(n)为在n内和与n互质的数的个数Φ(12)=4\Phi(12)= 4Φ(12)=4Φ(5)=4\Phi(5) = 4Φ(5)=4特殊的对于一个质数,他的Φ(p)=p−1\Phi(p) = p-1Φ(p)=p−1对于一个n,如果它能够被分解为两个质数的乘积,那么它的Φ(n)=(
2021-11-25 10:38:29 3600
原创 QT 开发学习 一
一 环境的配置 个人是建议使用一些IDE去写QT的代码,毕竟原生的环境实在是有点…比如CLion就很合适,此外还要去下载Qt creator,将其编译器的路径加入到我们的项目路径中去,这部分大家可以在网上搜教程二 Qt的项目结构 在QT中主要是以 *.cpp , *.h文件,在cpp文件中去声明类成员函数,在h文件中去声明我们的结构1. *.h文件的书写 首先我们要去define这个类#ifndef SUBWIN_H#define SUBWIN_H#include <QWidget&g
2021-11-06 16:52:45 379
原创 带权并查集
一 基础的并查集对于基础的并查集而言,只存在着两种操作,一种是寻找祖先一种是进行合并int find(int x){ if(x==pre[x]) return x; else return pre[x]=find(pre[x]);}void join(int x,int y){ pre[find(x)]=find(y);}二 带权并查集 对于带权并查集而言,它可以在我们的基础并查集上去维持一定的其他关系,比如距离等,在这里我们以杭电~HDUyyds的How Man
2021-11-03 20:22:13 944
原创 C++ primer 学习 二 迭代器
一 定义迭代器可以看作是一种更加通用的指针,通过它可以去访问vector或者string中的元素二 用法vector<int>::iterator it;vector<int>q;q.push_back(1);it = q.begin();printf("%d",*it);在声明时要使用type<elemtype>::iterator <name>这种形式去进行声明用法是与指针是基本相似的int int_arr[] = {0,1,2,3,
2021-11-01 18:21:07 296
原创 前缀和优化dp
在我们编写dp方程尤其是在区间dp的方程之中,我们经常能够使用到前缀和其进行优化,主要的原因是在于在进行区间dp的时候,有时候是对前面一层状态的一个累加,在这个时候我们完全可以使用前缀和对它进行优化,不过要注意的就是这个区间的边界问题 下面我们来看一道板子题,出门左转 对于这个板子题的意思我们很容易了解,就是在找到逆序对数目为k的排列的数目. 对于这个排列,我们可以得到这样一个方程 f[i][j]=∑k=j−i+1jf[i−1][k]f[i][j] = \sum_{k=j-i+1}^{j}f[i-1
2021-10-31 14:57:46 467
原创 Latex入门 (一) 提纲的编写
一 注释的编写% the comment二 声明\docmmentclass[UTF8]{ctexart} % 申明文档的类型是中文,UTF8编码\title{the title}\author{of course myself}\data{the date or \today}% if you use the \today it will show the date of today\bibliographystyle{plain}% the type of the literatu
2021-10-26 09:09:51 312
原创 主席树算法
主席树(可持久化线段树)一 定义个作用 对于主席树而言,这个其实并不能算作是一种数据结构,只能算作是一种思想,将原来的在堆上面的开点改为了现在的动态开点,每当我们要加入一个新的点的时候,我们都需要去在当前点重开一个点,得到一个新的关系 对每一个加入的新点得到它在原来式子中的排名(从1开始),然后根据这个排名去对他们进行更新,每次进行更新的时候去判断这个点是在前半段还是在后半段,在哪一段就对那一段进行更新,需要更新的次数为 log2n\log_2nlog2n二 基本操作1.buildint b
2021-10-26 09:09:02 162
原创 C++ primer 学习 一 类型
一 指针1. 指针的声明int *p // 此时的p是一个int型的指针int *p = 0;// WA,because the p haven't be allocate the spaceint *p,p1;// you must be attention that the p1 is the type of int,because the * only declocate the p2. 通过指针的赋值int *p = &a;*p = 1; // through this w
2021-10-14 23:11:00 149
原创 Linux上实现B站自由
ubuntu上b站 当你在linux上b站时,你会发现提示你要去下载flash播放器,然鹅flash的linux版本不太好下载…so 我们可以使用另外一种方式安装flash playersudo apt install flashplugin-installer下载我们的视频解码器sudo apt-get install h264enc重启之后,B站自由....
2021-10-13 20:54:38 1328
原创 树链剖析求LCA
树链剖析求LCA一 LCA问题 LCA问题即树上最近公共祖先,求解LCA问题经典的解法有倍增,tarjan(万能的Tarjan),当然还有我们的树链剖析了二 前置芝士在求解lCA之前,我们要知道树链剖析的一些基础知识,在树链剖析中分为轻重链剖析和长短链剖析重点:相依值最大的一个点(可以是根据子树的大小或者子树的深度进行选择),每一个点的子节点只有一个重节点轻节点:除重点之外的节点都是轻节点重链:指的是重点和其父节点相连的那个边轻链:指的是轻节点和其父节点相连的那个边顶点:指的是沿重链回溯到
2021-09-29 15:03:01 170
原创 编辑距离算法
编辑距离一 What’s this? 编辑距离指的是将一个字符串 aaa 通过 111.删除一个字符 2.2.2.插入一个字符 3.3.3.将一个字符改为另一个字符 这三种操作变为字符串bbb 的最小操作次数。二 解法dp[i][j]dp[i][j]dp[i][j] 为 aaa 的前 $ i$ 个变为 bbb 的前 jjj 个需要的最小操作次数dp[0][i]=i,dp[i][0]=idp[0][i] =i,dp[i][0] =idp[0][i]=i,dp[i][0]=idp[i][j]=min
2021-09-24 08:31:18 160
原创 点分治算法
淀粉质(点分治) 淀粉质(点分治)一 定义二 前置芝士1. 求树的重心2. 求点到根的距离3. 求距离为k的点4. 求解从now为根的树三 模版淀粉质可真好吃一 定义 点分治是一种用于求在树上的距离为 kkk 的点对的算法,如果暴力进行求解的话,时间的复杂度有 n2n^2n2 ,很明显对于这种时间复杂度会直接挂。 我们可以知道在以rootrootroot 为根的时候,那么两点之间的距离只存在两种情况经过root点不经过root点 在经过 rootrootroot 的时候,我们可以枚举
2021-09-23 18:03:26 271
原创 树的重心算法
一 定义树的重心就是使得这个重心的最大子树最小。二 性质一棵树最少有一个重心,如果有两个重心,那么这两个重心之间是有一条边相连的在树上的所有点到重心的距离之和是最小的。若以重心为根,那么所有子树的大小都不超过这个树大小的12\frac{1}{2}21在一个树上增加一个点,重心的最多平移一条边的距离两棵树链接成一个新的树,那么这个新的树的重心是在这两个树的重心的连线上三 重心的求解在重心的求解中,我们可以通过遍历得到所有节点的最大子树,通过比较得到最小值。void DFS(int n
2021-09-23 09:23:57 422
原创 正难则反In OI
一 主要用法 在求解问题的过程中,往往从正面出发的难度较大,假如一个集合的答案集合为AAA ,我们可能很难求出AAA,这个时候我们可以求出AAA的补集合从而求解AAA。二 + 容斥原理what is it?what\space is \space it?what is it? 在较难的题目中,答案需要满足的条件可能不止一个,假设满足条件 1→n1\to n1→n 的为 Ai(i∈[i,n])A_{i}(i\in[i,n])Ai(i∈[i,n]) ,从正面出发
2021-09-17 16:26:52 164
原创 计算几何——平面最接近点对
计算几何使人秃头,求平面最接近点对即在一个平面中有 nnn 个点,求这 nnn 点的最接近的两个点之间的距离,在洛谷上看,有大佬说旋转加排序(然鹅为啥要选择),个人觉得这个做法是不正确的,很容易被一些数据卡住。正解的话应该是分治求解,首先将平面上点按照xxx 轴分成左右均分的两部分s1,s2s_1,s_2s1,s2,那么对于最近的距离只有两种可能,1.1.1. 两个点都在一个区域内,s1s_1s1或者s2s_2s2。2.2.2. 两个点一个在s1s_1s1中,一个在s2s_2s2中。基
2021-09-17 09:00:19 292
原创 二分答案 推导+模版
二分答案一 定义二 算法的推导三 代码实现四 浮点数二分答案一 定义 二分答案通常用于求解在一个答案区间内的最大边界或者最小边界。主要的思想是通过判断中间点的可行性去更新左右边界直到得到最后的答案。二 算法的推导首先我们要了解几个专用的名词1.left 左边界2.right 右边界3.mid 中间点4.check(int x) check函数,用于检验可行性1.求解最大边界在求解最大的边界的过程中,我们很容易知道左右边界的更新方法,if(check(x)) l = mid; // 如
2021-09-16 17:31:47 173
原创 最小生成树算法
最小生成树一 prime算法1.定义2 代码实现3 prime算法的优化二 Kruskal算法1. 定义2 codefirst最小生成树first 最小生成树first最小生成树 最小生成树指的是在一个边有权的树上,求一个边权和最小的树形结构,并且使得这个树形结构要覆盖这个边上的所有点。现在求最小生成树的算法主要有两种,一个是 primeprimeprime 算法,一个是 KruskalKruskalKruskal 算法。一 prime算法1.定义 我们现在有一个集合AAA和一个集合EEE,分别为
2021-09-15 15:23:32 399
原创 树形dp算法
一 定义 树形dp通常指在各变元之间的关系是一个树形的结构,而非传统的线性结构,对于这种树形的dp,我们通常使用DFS去解决,时间的复杂度通常在 O(n2)O(n^2)O(n2)二 经典例题没有上司的舞会 题目的意思大概是在一个公司里面有着上下级关系,每个人都有一个快乐指数,在一个舞会里面,如果你邀请了一个人,那么他的直接下级就不能参加,基于这个状态,请问我们如何邀请可以使得快乐指数之和最大。解题思路 在点的数目较少的时候,我们可以使用 vectorvectorvector 进行存储每个点对应的
2021-09-14 13:58:22 267
原创 环形区间dp
dp是OI路上的一道天堑,很明显俺还在这个坑里1. 定义 这一类问题最典型的就是合并石子问题,即在一个区间上,进行元素的合并,将相邻小的元素或者区间逐渐合并成一个大的区间,最终合并为一个大的区间,在这个过程,我们需要使得一些量取得最大值,这大概就是区间dp的定义2. 例题NOI1995合并石子3. 思路1.求石子合并的最大值,转移方程如下f[i][j] = max(f[i][k]+f[k+1][j]) + sum[i][j]2.求石子合并的最小值,转移方程如下f[i][j] = min(
2021-09-13 18:21:06 355
原创 海伦公式判断点和三角形的关系
一 海伦公式如果有一个三角形,它的三边分别为 $a, b ,c $, 则三角形的面积为 A=s(s−a)(s−b)(s−c)A = \sqrt{s(s-a)(s-b)(s-c)}A=s(s−a)(s−b)(s−c) , s=a+b+c2s = \frac{a+b+c}{2}s=2a+b+c二 判断一点和三角形的关系三角形的三点为A,B,CA, B, CA,B,C,我们需要判断的点是DDD如果S△ABC=S△BCD+S△ABD+S△ACDS\triangle ABC = S\triangle
2021-09-13 12:51:52 620
原创 凸包解决数学问题
一 定义利用图像的凹凸性解决一些数学问题,如查找最大的斜率。二 例题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rlDYjdPD-1631264643717)(/Users/chengjiajun/Library/Application Support/typora-user-images/Screen Shot 2021-09-10 at 4.27.51 PM.png)] 其实我们可以知道这道题其实就是求在长度为 [s,t][ s, t][s,t] 的子
2021-09-10 17:04:34 341
原创 单调栈解决取矩形问题
单调栈解决取矩形问题 前言:这一类问题不知道是什么问题,emmm大概意思就是从一个混合着可行点和不可行点的矩形中能取出的充满可行点的矩形的数目。这一类问题应该有一个官方的名字,大家如果知道可以在评论区中给出。一 思想概括对于这样的一个数据,其中1为可行点,求最多能得到多少个矩形1 0 1 01 1 1 01 1 1 1 设a[i][j]a[i][j]a[i][j]点的向上的可拓展的高度为 hhh,那么我们要查找的就是在此高度范围内包含a[i][j]a[i][j
2021-09-10 07:59:22 97
原创 悬线法求最大矩形
悬线法一 定义 悬线的定义,就是一条竖线,这条竖线要满足上端点在整个矩形上边界或者是一个障碍点。然后以这条悬线进行左右移动,直到移至障碍点或者是矩阵边界,进而确定这条悬线所在的极大矩阵。二 悬线法的使用 首先我们要得到一个r数组和一个l数组,记录这个点的左边可到达点和这个点的右边可到达点。在用up数组得到这个点的向上最大高度,从而得到最终的解。三 code初始化 for(int i = 1;i <= n;i++) for(int j = 1
2021-09-09 20:53:28 130
原创 多维dp详解
多维dp一 定义多维dp问题指的是一个问题具有多个维度,通常可类比于二维数组取数问题,进行直接暴力dp的话时间和空间的复杂度为O(n4)O(n^4)O(n4)下面以传纸条为例二 暴力的四维dp对于传纸条可以选择从上面和左边进行选择f[i][j][p][q]=max(f[i−1][j][p−1][q],f[i][j−1][p−1][q],f[i−1][j][p][q−1],f[i][j−1][p][q−1])f[i][j][p][q] = max(f[i-1][j][p-1][q],f[i][j-
2021-09-09 20:32:35 807
原创 拓展欧几里算法
一 定义拓展欧几里通常用于解决同余方程同余方程:形如ax+by=gcd(a,b)ax+by =\gcd(a,b)ax+by=gcd(a,b)的方程二 解法因为gcd(a,b)=gcd(a,b mod a)\gcd(a,b) = \gcd(a,b\space mod\space a)gcd(a,b)=gcd(a,b mod a)假设现在有bx′+(a mod b)y′=gcd(b,a mod b)bx^{'}
2021-09-08 14:33:37 120
原创 容斥原理及其应用
容斥原理一 定义容斥原理就是说对于一些集合,要去求他们的并集。from wiki二 解题容斥原理优化多重背包问题样板题 优化的方向:如果已经知道物品的全部价值,进行多次查询,每一次的物品数目都是不一样的,背包的容量也是不一样的,此时如果直接去使用多重背包的一般解法(使用二进制转化为01背包问题或者使用单调队列进行优化)都会…T掉。所以要利用前面的状态就可以使用容斥原理进行优化 在初始的时候,我们将其作为完全背包进行处理,得到在物品数目不受限制的情况下的所有的可
2021-09-06 16:51:12 421
原创 费马小定理及其应用
费马小定理一 定理内容如果p是质数,并且a不是p的倍数。那么就有ap−1=1(mod p)a^{p-1} = 1(mod\space p)ap−1=1(mod p)其次我们还需要去了解逆元的意义对于正整数a和p,如果有ax≡1(mod p)ax\equiv 1(mod\space p)ax≡1(mod p) ,那么称x的最小整数解为a模p的逆元由上面的结论我们可以得到a的逆元其实就是ap−2a^{p-2}ap−2 ,对于这个数我们可以使用快速幂来计算结果
2021-09-05 20:37:24 3939
原创 康托展开算法
康托展开一 定义 康托展开其实就是一个类似于hash的做法,是一个全排列到一个自然数的双射,常用于构建hash表的空间压缩,以此就能得到一个数的一个排列和根据这个排列得到这个数的大小,我觉得单独说这个东西可能有一点玄学,还是拿一道题目来看二 例题三 解题 在这道题目里面,我们首先得到这个最初始排列的字典序的位置,如 4 2 1 ,对于第一位4来说,这个数字前面就只有2 1两个数字,所以前面的数字为2*2!,对于数字2来说,前面的数字只有1,所以前面的数位1 *1,对于1
2021-09-04 14:27:29 144
原创 Floyd 判环算法
Floyd 判环算法一 算法内容 该算法的内容类似赛跑,两个人在操场上赛跑,跑的快的一定能够比跑得慢的多跑一圈,在链表的判环中,我们可以使用一个快指针和一个慢指针,慢指针每次走一步,快指针每次走两步,当快指针和慢指针相遇的时候,就说明这个慢指针已经走了一个环二 例题Calculator Conundrum#include<iostream>#define ll long longusing namespace std;int buf[20];int next(int n,int
2021-08-19 19:04:13 76
原创 UVA11300 Spreading the Wealth
UVA11300 Spreading the Wealth思路 对于这道题,我们可以将其转化为一道线性代数的问题,设第iii个人的初始值为AiA_{i}Ai,第iii个人给第i−1i-1i−1个人的金币数目为xix_{i}xi,设最终值为avgavgavg,我们可以得到这样一个等式A1−x1+x2=avgA_{1}-x_{1}+x_{2}=avgA1−x1+x2=avg,设C1=A1−avgC_{1} = A_{1}-avgC1=A1−avg得到x1−x2=C1→x2=x1−C1(1)x
2021-08-18 15:22:45 143
原创 差分约束算法
差分约束算法一 定义 差分约束算法通常用于解决差分约束算法==(属于线性规划)==,解决差分约束问题我们通常将它转化为最短路或者最长路问题,比如我们有如下的差分关系{x1−x2>3x2−x3>2...\begin{cases}&x_{1}-x_{2}>3\\&x_{2}-x_{3}>2\\&... \end{cases}⎩⎪⎨⎪⎧x1−x2>3x2−x3>2...,我们可以将每一个变元都看作是一个点,x1−x2>3x_{
2021-08-16 11:50:18 145
原创 矩阵加速算法
矩阵加速一 原理推导 矩阵加速即利用矩阵的计算来得到一个数列的递推式,进行计算的矩阵可以利用数列的数项关系得到,以下面的一个数列式为例ax={1x∈{1,2,4}ax−1+ax−3x>=4a_{x}= \begin{cases} 1& x\in\{1,2,4\}\\ a_{x-1}+a_{x-3}& x>=4 \end{cases}ax={1ax−1+ax−3x∈{1,2,4}x>=4,求它的第n项的值 利用上面的关系式可以得到三个式子{ax=1∗a
2021-08-16 09:51:35 560
原创 裴蜀定理详解
裴蜀定理一 内容 对任何整数a、b和它们的d,关于x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数对任何整数a、b和它们的d,关于x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数对任何整数a、b和它们的d,关于x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。x,y,ax+by都
2021-08-15 20:01:23 1901
原创 三分法算法
三分法一 定义 三分法在类似于二分法,本质是一样的,比如在一个区间内我们要求区间[l,r][l,r][l,r]单调性的分界点,那我们判断f[mid+x]andf[mid−x]f[mid+x] and f[mid -x]f[mid+x]andf[mid−x]的大小关系,就可以判断出这个区间内的单调性的分界点的位置关系二 模版题#include<iostream>using namespace std;const double eps=1e-7;//其实一般精度*0.1=1e-6就可以了
2021-08-15 18:21:42 847
原创 C++迭代器
C++迭代器一.what is iterator? 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。二. 使用迭代器 和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为begin, end的成员,其中begin成员负责返回第一个元素,end成员负责返回指向容器“尾部元素的下一位置”auto a = v.begin(), e = v
2021-08-14 17:35:18 156
原创 Latex 入门
Latex 入门一 下载我们的TEX在下载我们的TEX后还需要下载一个编辑器去让编写Latex更加容易Option1 : 在vscode 中安装Latex WorkshopOption2 : 安装Texstudio二 Latex的基本结构\documentclass[UTF8]{ctexart} %声明文章的编码格式,中文1使用UTF8%从此处直到begin{document}处均为导言区,一般书写文章的配置信息,如引用的包等\title{LaTex Title} %文章标题\a
2021-08-13 16:13:18 461
原创 字符串哈希
字符串哈希字符串哈希模版题一 思路我们将字符串转化为数字,然后将这个数字储存在数组中,然后在对着干数组进行去重的操作,得到我们的字符串的种类二 code#include<iostream>#include<string.h>#include<algorithm>#define ll long long#define N 1010#define base 111#define add 11ll mod = 12345224345454232;usi
2021-08-12 16:01:50 65
原创 矩阵快速幂
矩阵快速幂一 原理快速幂+矩阵乘法,其实就是把原来的乘法换成矩阵乘法二 code#include<iostream>#include<string.h>#define N 201#define ll long longusing namespace std;ll n,k;typedef struct{ ll elem[N][N];}martix;martix a,ans,b;martix Cheng(martix c,martix d){
2021-08-12 12:04:37 133
原创 python 文件读写
python 文件读写1 读入一个文件input_file = input()# input the filenamewith open(input_file, 'r',newline = '') as filereader: for row in filereader: print("{}".format(row.rstrip())) # output the content by row2 读入多个文件import globimport osin
2021-08-12 00:01:34 140
原创 二维前缀和
二维前缀和 在区间查询之类的问题中我们经常用到一维的前缀和,一维的前缀和的公式较易写出sum[i] = sum[i-1] + a[i] 而对于二维的前缀和的公式较为复杂sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]二维前缀和模版#include<iostream>#define N 5010using namespace std;int pre[N][N],n,m,x,y,z,ans;int main()
2021-08-11 10:20:01 85
空空如也
使用vector数组出现了一些问题
2021-03-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人