
笔记
文章平均质量分 64
proudzhao
这个作者很懒,什么都没留下…
展开
-
树上启发式合并 (dfs on tree)
树上启发式合并原创 2022-10-10 17:46:13 · 157 阅读 · 0 评论 -
莫比乌斯反演
莫比乌斯函数对于一个正整数nnn,μ(n)\mu(n)μ(n)为其莫比乌斯函数。莫比乌斯函数是怎么样定义的呢?首先,对于任意一个正整数nnn来说,由算数基本定理知,一定可以将其分解成n=p1a1p2a2...pkakn=p_1^{a_1}p_2^{a_2}...p_k^{a_k}n=p1a1p2a2...pkak的形式。定义μ(n)={(−1)k, a1=a2=...=ak=10, otherwise\mu(n)=\begin{cases} (-1)^k,\ a_1=原创 2021-09-29 21:14:27 · 1349 阅读 · 0 评论 -
学习笔记:整除分块
有这样一个式子:∑i=1n⌊ni⌋\sum_{i=1}^n\lfloor \frac{n}{i} \rfloor∑i=1n⌊in⌋,求出它的结果。我们当然可以从111到nnn一个一个算,但这样太慢了。先看一个例子,当n=20n=20n=20的时候:可以看到,有许多不同的iii值对应的其实是相同的结果。我们是不是可以找到一个区间[l,r][l,r][l,r],使得⌊nl⌋\lfloor \frac{n}{l} \rfloor⌊ln⌋一直到⌊nr⌋\lfloor \frac{n}{r} \rf原创 2021-09-29 14:03:05 · 233 阅读 · 0 评论 -
约数之和和约数个数
前置知识:一个数的约数个数的求法:对于一个数x,由算术基本定理 (任何一个大于1的自然数,都可以唯一的分解成有限个质数的乘积)即 x = p1a1×p2a2×……×pkak另 t = p1b1×p2b2×……×pkbk (0<=bi<=ai)那么t一定是x的一个约数所以根据指数的不同,x的约数也不同,指数的所有不同取法囊括了x的所以约数所以:x的约数个数为 (a1+1)(a2+1)(a3+1)……(ak+1)一个数的约数之和的求法:由上面可以知道:x = p1a1×p2a2×…原创 2021-02-10 22:21:35 · 360 阅读 · 0 评论 -
ACM中一些常用数学公式定理的简单推理及证明
文章目录更相减损术更相减损术gcd(a,b)=gcd(a,b−a)gcd(a,b)=gcd(a,b-a)gcd(a,b)=gcd(a,b−a)证明:证明:证明:若有gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,则有a=k1d, b=k2da=k_1d,\ b=k_2da=k1d, b=k2d,且k1k_1k1与k2k_2k2一定互质,即gcd(k1,k2)=1gcd(k_1,k_2)=1gcd(k1,k2)=1。设gcd(a,b−1)=xdgcd原创 2021-09-22 13:44:46 · 1027 阅读 · 0 评论 -
学习笔记:前缀和与差分
1、前缀和(一维,二维)应用:一维:快速求一段连续子序列的和二维:快速求一个子矩阵的和//一维前缀和const int N = 1e5+5;int n,q,a[N],s[N];//a是原数组,s是前缀和数组int main(){ cin>>n>>q; for(int i=1;i<=n;i++) cin>>a[i], s[i]=s[i-1]+a[i]; while(q--)//q次询问 { int l,r; cin>>l&原创 2021-01-31 12:01:36 · 129 阅读 · 0 评论 -
学习笔记:双指针算法
双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。例题:AcWing 799. 最长连续不重复子序列给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。做法:开一个数组vis记录区间[i,j]中出现过的数的个数,当i向前移动时,将a[i]加入了区间,如果发现vis[a[i]]>1,也就是说a[i]这个数在区间中出现的次数大于1,那么左指针j就要向后移动,同时v原创 2021-01-31 15:11:04 · 113 阅读 · 0 评论 -
学习笔记:单链表(数组模拟)
#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<map>#include<set>#include<stack>#include<queue>#include<string>#include<vector>#define ll原创 2021-01-31 20:36:04 · 156 阅读 · 0 评论 -
学习笔记:二分法
问题引入:给定一个按照升序排列的长度为n的整数数组,询问元素k,返回k在数组中的起始位置和终止位置。如果数组中不存在该元素,则返回“-1 -1”。例如:6 31 2 2 3 3 4则应返回4 5二分最重要的一步是区间划分,即确定左区间表示什么,右区间表示什么,然后确定是输出l还是r对于本题,求起始位置时,可以让>=k的元素划分到右区间,最后起始位置start=r求终止位置是可以让<=k的元素划分到左区间,最后终止位置end=lconst int N = 1e5+5;in原创 2021-01-30 21:03:35 · 156 阅读 · 1 评论 -
学习笔记:归并排序
基本步骤:1、分界点 mid=(l+r)/22、递归排序(left,right)3、合二为一#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<map>#include<set>#include<stack>#include<queue>#inclu原创 2021-01-30 12:29:08 · 91 阅读 · 0 评论 -
学习笔记:快速排序
基本步骤:1、确定分界点x(a[l],a[r],a[l+r>>1])2、划分区间(小于x的在一边,大于x的在另一边)3、递归处理左右两端const int N = 1e5+5;int n,a[N];void quick_sort(int a[],int l,int r){ if(l>=r) return ; int i=l-1,j=r+1,x=a[l+r>>1]; while(i<j) { while(a[++i]<x); whi原创 2021-01-30 11:39:59 · 102 阅读 · 0 评论 -
学习笔记:离散化
离散化 是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。看一个例子:AcWing 802. 区间和假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。(-1e9 <= x,l,r <= 1e9, 1 <= n,m <=原创 2021-01-31 17:29:51 · 178 阅读 · 0 评论 -
学习笔记:高精度[模版] (vecor实现)
#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<iostream>#include<map>#include<stack>#include<queue>#include<string>#include<vector>#define ll long long#define u原创 2021-01-28 21:28:42 · 159 阅读 · 0 评论 -
学习笔记:扩展欧几里得
写法一:int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int g=exgcd(b,a%b,x,y); //参数正传 int x0=x,y0=y; x=y0; y=x0-a/b*y0; return g;}int main(){ int n; cin>>n; while(n--) { int a,b; a=read(); b=read();原创 2021-02-09 16:57:18 · 149 阅读 · 0 评论 -
KMP与AC自动机 和 DP的结合
设计密码你现在需要设计一个密码 S,SS,SS,S 需要满足:S 的长度是 N;S 只包含小写英文字母;S 不包含子串 T;例如:abcabcabc 和 abcdeabcdeabcde 是 abcdeabcdeabcde 的子串,abdabdabd 不是 abcdeabcdeabcde 的子串。请问共有多少种不同的密码满足要求?(由于答案会非常大,请输出答案模 1e9+71e9+71e9+7 的余数。)输入格式第一行输入整数NNN,表示密码的长度。第二行输入字符串T,TT,TT,T中只原创 2021-09-21 18:10:31 · 177 阅读 · 0 评论 -
Splay
请写一个程, 要求维护一个数列, 支持以下 6 种操作:1、插入:在当前数列的第 posi 个数字后插入 tot 个数字:c1, c2, …, ctot;若在数列首插 入,则 posi 为 02、删除:从当前数列的第 posi 个数字开始连续删除 tot 个数字3、修改:从当前数列的第 posi 个数字开始连续删除 tot 个数字4、翻转:取出从当前数列的第 posi 个数字开始的 tot 个数字,翻转后放入原来的位置5、求和:计算从当前数列的第 posi 个数字开始的 tot 个数字的原创 2021-09-18 16:35:00 · 132 阅读 · 0 评论 -
AC自动机
前置技能:KMP和trie树。AC 自动机是一种用于解决多模式串以及一主串匹配的字符串算法。问题通常是给出若干个模式串 S 以及主串 T,询问若干个模式串分别在主串中的某些信息。AC 自动机构建在 Trie 的结构基础上,结合了 KMP 算法的失配指针思想。P3808 【模板】AC自动机(简单版)题目描述给定 n 个模式串 Si 和一个文本串 T,求有多少个不同的模式串在文本串里出现过。两个模式串不同当且仅当他们编号不同。输入格式第一行是一个整数,表示模式串的个数 n。第 2 到第 (原创 2021-09-18 16:09:28 · 153 阅读 · 0 评论 -
bfs之八数码
在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x 4 6 4原创 2021-03-21 20:43:39 · 268 阅读 · 1 评论 -
学习笔记:逆元
如果 ax≡1 (mod p),那么,x就是a的逆元,相互的,a也是x的逆元。那么你逆元有什么用呢?首先我们需要知道,取余运算对除法是不适用的,a/b % p ≠ (a%p / b%p) %p,如果我们要计算若干个数相乘起来除以某个数时,并不能像乘法那样边乘边取余,所以我们可以将a/b%p转化为 ab-1%p (b-1是指b在模p下的逆元,不是b的-1次方),这样就可以边乘边取余逆元的求法:方法一:欧拉函数int power(int a,int b,int p){ int res=1%p;原创 2021-02-12 14:07:56 · 489 阅读 · 0 评论