模板
文章平均质量分 76
常用模板
ACfunhsl
这个作者很懒,什么都没留下…
展开
-
卡特兰数总结
卡特兰数经典模型:有nnn个000和nnn个111,有多少种排列方式使得任意一个前缀中,111的个数不少于000的个数?卡特兰数经典模型的证明:我们可以在数轴上看这个问题,从原点出发,将111看成向右上走一步,000看成向右下走一步,那么走完这2n2n2n步会到达点(2n,0)(2n,0)(2n,0)。不做限制时的走法是C2nnC_{2n}^nC2nn,即在2n2n2n步中选nnn步放111。当我们加上限制,任意一个前缀中,111的个数不少于000的个数,那么我们的路线不可能触碰到 y=−1y=-1y=原创 2021-04-26 19:13:18 · 415 阅读 · 0 评论 -
P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
题目传送门题意: TTT组询问,给你 a,b,da,b,da,b,d,求出1<=x<=a,1<=y<=b,gcd(x,y)=d1<=x<=a,1<=y<=b,gcd(x,y)=d1<=x<=a,1<=y<=b,gcd(x,y)=d 的数量。思路: 以下推导中,除法均为整数。f(d)=∑x=1a∑y=1b[gcd(x,y)=d]f(d) = \sum_{x=1}^a \sum_{y=1}^b [gcd(x,y)=d]f(d)=∑x原创 2021-04-15 00:04:19 · 162 阅读 · 0 评论 -
中国剩余定理及其拓展
中国剩余定理求下列同余方程组的解(保证ni,njn_i,n_jni,nj两两互质):x≡a1(mod n1)x≡a_1(\mod n_1)x≡a1(modn1)x≡a2(mod n2)x≡a_2(\mod n_2)x≡a2(modn2)x≡a3(mod n3)x≡a_3(\mod n_3)x≡a3(modn3)…x≡ak(mod nk)x≡a_k(\mod n_k)x≡ak(modnk)唯一解:ans≡∑ai∗ci(mod M)ans≡\sum a_i*c_i(\原创 2021-04-05 14:38:55 · 152 阅读 · 0 评论 -
exgcd
题目传送门对于不等式:ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b),给定a,ba,ba,b,求出符合条件的一组x,yx,yx,y。推导: (假定a>=b)1.ax1+by1=gcd(a,b)ax_1+by_1=gcd(a,b)ax1+by1=gcd(a,b)2.bx2+a%by2=gcd(b,a%b)bx_2+a\%by_2=gcd(b,a\%b)bx2+a%by2=gcd(b,a%b)3.gcd(a,b)=gcd(b,a%b)gcd(a,b)原创 2021-03-25 16:23:48 · 181 阅读 · 0 评论 -
Meissel-Lehmer算法(求N以内素数个数)
比欧拉筛快。#define MAXN 100 // pre-calc max n for phi(m, n)#define MAXM 10010 // pre-calc max m for phi(m, n)#define MAXP 40000 // max primes counter#define MAX 400010 // max prime#define setbit(ar, i) (((ar[(i) >> 6]) |= (1 << (((i) >原创 2021-03-24 22:52:31 · 638 阅读 · 0 评论 -
多重背包的单调队列优化
题目传送门在求解多重背包的时候,我们最朴素的方法就是把所有物品看做独立的然后01背包求解,这样的时间复杂度是O(NV∑K)O(NV\sum K)O(NV∑K)的,然后我们可以用二进制优化,时间复杂度是 ,然而对于有些题我们还是过不去。这时候我们就需要用单调队列去优化了。我们先考虑普通的状态转移方程:f[i][j]=max(f[i−1][j−k∗w]+k∗v),(j−k∗w>=0)f[i][j]=max(f[i-1][j-k*w]+k*v),(j-k*w>=0)f[i][j]=max(f[i原创 2020-11-04 21:07:11 · 237 阅读 · 0 评论 -
除法分块
T1:题目传送门T1题意 : 定义f(n)为n 的因子和,给你l,r,求 f ( l ) + f ( l + 1 ) + … + f ( r )思路: 首先,我们可以定义g(n) 为 f (n) 的前缀和,那么所求式子即 g( r )-g(l-1),对于一个g(n),我们可以得到式子 g(n) = n / 1 * 1 + n / 2 * 2 + n / 3 * 3 + …+n / n *n, (每个因子出现的次数乘因子贡献。)我们可以把出现次数相同的因子,分为一个块,每个块有一个左边界一个右边界,我原创 2020-09-28 14:26:35 · 533 阅读 · 1 评论 -
Min 25筛,求10亿以内的素数和
const int N = 1000010;typedef long long LL;namespace Min25{int prime[N], id1[N], id2[N], flag[N], ncnt, m;LL g[N], sum[N], a[N], T, n;inline int ID(LL x){ return x <= T ? id1[x] : id2[n / x];}inline LL calc(LL x){ return x * (x +原创 2020-09-21 12:22:57 · 481 阅读 · 0 评论 -
莫比乌斯函数的两种求法(基于欧拉筛、埃氏筛)
给出莫比乌斯函数的定义:这里的n即u(i)中的i,即i=1时,u(1)=1;i大于1且i中某个质因子的幂超过1,则u(i)=0;否则,u(i)取决于其质因子个数的奇偶性。这里给出两个莫比乌斯函数的性质:简略证明性质1:由唯一分解定理,在n的因子中,某个因子的质因子的幂超过1,那么u(d)=0,对于性质1我们不用管他,所以只研究质因子的幂全是1次的因子就行。假设n有质因子k个,那么,性质1可以转化成以下式子,即在k个质因子中选i个组成因子,因为i是奇数的时候,这个因子的莫比乌斯函数值是-1,所以原创 2020-07-17 18:51:56 · 657 阅读 · 0 评论 -
P2197 nim游戏(nim博弈)
题目传送门题意: 有n堆石子,每一堆有a[i]个,两个人轮流取石子,每次只可以在一堆中取,可以取完但是不能不取,最后无石可取的人失败,假设双方都足够聪明,问你先手有没有必胜策略?结论: 当且仅当 a[1] xor a[2] xor a[3] … a[n-1] xor a[n]==0时先手败。证明: 一、最开始n堆石子都是0个的情况,先手败。二、有n是偶数且所有堆石子相同,先手败(后手只需要每次跟先手拿一样的数目)。三、其他异或和为0的情况。这时候,假设我们先手拿了石子打破了异或和为0的情况,当前异原创 2020-06-25 19:47:45 · 159 阅读 · 0 评论 -
P1962 斐波那契数列(矩阵快速幂模板)
题目传送门题意: 对于数列f[1]=1,f[2]=1,f[i]=f[i-1]+f[i-2] (i>=3),求第n项对1e9+7取模的结果。思路: 之前写的模板好像有点问题 ,模板题,距阵快速幂加速递推。代码:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ls p<<1#define rs p<<1|1#define fi first#define se secon原创 2020-06-16 22:29:43 · 203 阅读 · 0 评论 -
P3807 【模板】卢卡斯定理(组合数学)
题目传送门这种求组合数我们不一定能通过常规的组合数方法去求,因为有可能n,m会大于mod,这样我们求出来的组合数就会不正确,而卢卡斯定理就可以很好的解决这一问题。由于能力限制,证明后续补上因为题目保证p是质数,所以费马小定理求逆元方便些,如果不是质数就用exgcd或者欧拉定理。代码:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ls p<<1#define rs p<<原创 2020-06-15 22:19:39 · 168 阅读 · 0 评论 -
P5905 【模板】Johnson 全源最短路(存在负边权的全源最短路)
题目传送门题意: 给你一张图,可能存在负的边,如果存在负环则输出-1,否则按照题目要求输出 求和公式不会打 。对于这个,判断是否存在负环跑spfa即可。如果不存在负环,我们可以用n遍spfa去处理这个问题,spfa的时间复杂度是O(kE),k是常数,最坏可以达到O(VE),V即顶点数,跑n遍那就是O(V2E),那有没有更加理想的算法呢?有!Johnson算法。Johnson算法在一个带负边权但无负环的图中,我们建立一个虚点,并且从这个虚点出发到每一个点都建立一条长度为0的有向边,以这个虚点为源点,原创 2020-05-12 14:42:43 · 282 阅读 · 0 评论 -
P3385 【模板】负环(spfa判负环)
题目传送门这题是只看从点1能否到达负环,所以只加点1到队列中。如果看某张图中有没有负环,我们需要在每个连通块中都加一个点到队列中,也可以把所有点加到队列中(更保险)。#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ls p<<1#define rs p<<1|1#define fi first#define se second#define mp make_pair#d原创 2020-05-12 11:51:36 · 148 阅读 · 0 评论 -
P3375 【模板】KMP字符串匹配(kmp)
题目传送门首先,我觉得这篇博客讲的算非常好的了。链接->点这里kmp: kmp,字符串匹配,检索一个小串是否在另一个大串中出现过,并且可以统计次数,比如我们需要在一个祖安人写的文章中找出他说了多少个 “sbsb” 然后根据情况判定该禁言多久。我们暴力的从每一个字符开始,截取6个字符,逐一比较,这肯定可以,但是时间复杂度为O(n*m),即两个串长度的乘积。而kmp算法可以做到O(n+m)。...原创 2020-05-04 18:38:27 · 341 阅读 · 0 评论 -
P1495 【模板】中国剩余定理(CRT)
题目传送门题意: 给你n对数,有一个x,x%m[1]=a[1],x%m[2]=a[2]…x%m[n]=a[n],求x的最小整数解。(保证所有m[i]两两互质)crt(中国剩余定理) 对于x%m1=a1,我们可以转化成 x+m1*y=a1 ①我们令M=m[1] * m[2] * m[3]…* m[n],t=M/m[1],因为m[i]两两互质,所以有t与m[1]互质,由裴...原创 2020-04-30 14:34:47 · 163 阅读 · 1 评论 -
P5656 【模板】二元一次不定方程(exgcd)
题目传送门题意: 给定不定方程ax+by=c。若该方程无整数解,输出 -1若该方程有整数解,且有正整数解,则输出其正整数解的数量,所有正整数解中 x 的最小值,所有正整数解中 y 的最小值,所有正整数解中 x 的最大值,以及所有正整数解中 y 的最大值若方程有整数解,但没有正整数解,你需要输出所有整数解中 x 的最小正整数值, y 的最小正整数值正整数解即为 x,y。x,y 均为正整数的...原创 2020-04-29 23:45:01 · 692 阅读 · 0 评论 -
P3379 【模板】最近公共祖先(欧拉序+RMQ解LCA)
题目传送门这里推荐一篇带图的讲解链接会讲的更详细一些。#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ls p<<1#define rs p<<1|1#define fi first#define se second#define mp make_pair#de...原创 2020-04-20 21:56:21 · 173 阅读 · 0 评论 -
P2580 于是他错误的点名开始了( trie树)
题目传送门题意:给你n个字符串,m次查询,每次查询一个字符串,如果原来有这个字符串且是第一次查询该串,输出OK,如果原来有这个字符串但是不是第一次查询,输出REPEAT,如果原来没有,则输出WRONG。思路:map好像可以轻松过 。这里我用的是刚学的 trie树。把字符串存好之后每次查询即可,查询过之后num改为2,表示这个单词查询过。trie树链表写法#include<bits/s...原创 2020-04-02 19:02:12 · 150 阅读 · 0 评论 -
大区间求区间欧拉函数(洛谷P3601)
题目传送门欧拉函数:对于n,φ(n)表示1到n内与n互质的数。题意,定义一个函数f,f(x)表示x以内与x不互质的数的个数。给定一个区间,求出这个区间内f(i) (l<=i<=r)的总和对666623333取模的结果。数据范围1<=l<=r<=1e12,r-l<=1e6求不互质的数的个数,我们只需要求这个数的欧拉函数,然后f(x)=x-φ(x),问题...原创 2020-03-19 22:26:26 · 257 阅读 · 0 评论 -
素数密度(求区间内素数个数)
题目传送门题意:给你一个区间,求这个区间内素数的个数。数据范围(L≤R≤2147483647,R-L≤1000000)思路区间是在int范围内的,所以一个数的最大质因子不会超过5e4。但是注意区间长度,如果我们遍历区间,然后一个一个判断,喜提TLE。但是一般的筛法又处理不到这个数据范围,所以我们就另辟蹊径。前面说到区间内任何一个数的最大质因子不超过50000,那么我们可以先用筛法求出...原创 2020-03-15 19:20:17 · 1210 阅读 · 1 评论 -
最近公共祖先模板(LCA)
题目传送门LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。 ———来自百度百科我们用链式前向星存树。int head[N<<1],nex[N<<1],to[N<<1],tot=0;void add(int a,int b){ to[++tot]=b; nex[t...原创 2020-03-08 16:16:14 · 210 阅读 · 0 评论 -
逆元的求法
题目传送门题目大意:给你一个正整数n,一个模数p,要你求从1~n中每一个数的逆元。数据范围:1≤n≤3×106 ,n<p<20000528;保证p是质数。方法1:费马小定理对于p是质数的情况下,我们可以用快速幂进行求逆元,原理是费马小定理。费马小定理:对于质数p,ap-1 ≡ 1(mod p),我们要求a的在模p意义下的逆元的时候,有a*inv(a)≡1(mod p),又根据...原创 2020-03-07 17:16:51 · 1739 阅读 · 0 评论 -
裴蜀定理简单证明及其推广(洛谷P4549)
题目传送门裴蜀定理所谓裴蜀定理,即对于两个正整数x,y,若ax+by=c,则c%gcd(x,y)==0。证明令s=gcd(x,y),那么x%s== 0,y%s== 0,当然有ax%s== 0,by%s== 0,所以c%s==0。如果是三个正整数x,y,z,那么ax+by+dz=c,同理 c%gcd(x,y,z)==0。推广由两个数推广到多个数,最后得到的结果一定是这多个数的gcd的倍...原创 2020-03-06 22:58:51 · 1116 阅读 · 0 评论 -
【模板】字符串哈希
题目传送门字符串哈希,说白了就是一个函数,你把一个字符串输入进去处理,输出一个更容易储存或者比较的东西,相当于一个加密的过程。但是对于同一个加密方法,可能会有不同字符串得到同样的结果的情况,所以我们要做的就是让字符串的哈希值尽量不相等。一般我们现在接触到的字符串哈希,基本思想就是把它的每一位转化成一个特殊进制数的一个数位,这个大数可能会很大,如果我们直接比较大数,这就和直接比较字符串没什么区别...原创 2020-03-05 20:43:26 · 165 阅读 · 0 评论 -
求单个数的欧拉函数
根据唯一分解定理,一个数可以写成若干个质数的幂的乘积,那么我们在循环中,如果碰到i是n的因子,就把它除尽,下次碰到的i肯定又是质因子,所以每次碰到的i都是质因子,当我们把质因子除尽后,n就等于1了,要是最后n不是1,那么说明n没有变化,即n本身是素数,所以给出的结果要减去1(如果n是素数,n的欧拉函数值是n-1)。ll euler(ll n){ ll t=n; for(ll i...原创 2020-02-10 20:22:36 · 470 阅读 · 0 评论 -
欧拉函数
埃氏筛法求欧拉函数void euler(int n){ for (int i=1;i<=n;i++) phi[i]=i; for (int i=2;i<=n;i++) { if (phi[i]==i)//这代表i是质数 { for (int j=i;j<=n;j+=i) {...原创 2020-02-10 19:06:16 · 131 阅读 · 0 评论 -
st表
st表可以用于求大区间的一个小区间中的最值问题。我们这里讨论最大值。我们用st[i][j]表示以 i 为起点,i+(1<<j)为终点的这一段区间中的最值,那么显然,st[i][0]就是存区间中的第i个元素了。那么由i开始的1<<j个元素的最大值,就等于前一半的最大值与后一半的最大值中较大的那个,比如前一半的最大值是4,后一半中最大值是7,那么整段子区间的最大值就是7。...原创 2020-01-22 22:31:03 · 181 阅读 · 0 评论 -
并查集模板
#并查集并查集(合并与查询)假设有五个人,A,B,C,D,E。A和B是朋友,B和C是朋友,D和E是朋友,那么我们可以看到A-B-C这个朋友圈,D-E这个朋友圈,我们发现A,C虽然不是朋友但是他们通过B 相连,在同一个朋友圈内,所以我们查询的时候可以得到A,C属于同一个集合,而A,D不属于同一个集合。朴素版void initialize( int Arr[ ], int N) { f...原创 2020-01-20 23:32:31 · 106 阅读 · 0 评论 -
快速乘
#快速乘题:计算a*b%p,其中1<=a,b,p<=1e18;很明显,我们就算开long long也是会爆的,然后,高精度?想想,高精度乘法加高精度取模,多麻烦(用C语言实现,你会Java、Python的话当我没说)所以,我们用快速乘的方法解决这个问题。快速乘和快速幂的思想类似,只是将乘换成加。#include<bits/stdc++.h>#define IOS...原创 2019-12-23 15:49:44 · 104 阅读 · 0 评论 -
快速幂
#快速幂对于a^b%p,如果数据小一点,我们可以用pow函数计算,但是如果a,b都给到1e9以上,我们是没办法计算的,所以我们这里学习一种新的算幂的方法。快速幂比如我们要算2^ 15,我们可以把它写成22^ 14->24^ 7->244 ^ 6->8163…等等,只要在运算的过程中进行每步取模,就可以把它很快的算出来,时间复杂度仅仅是O(logn).代码:ll qpow...原创 2019-12-23 12:27:45 · 78 阅读 · 0 评论 -
离散化板子
题目大概意思是给定一个大区间(起点为0,终点为1e9),若干个(小于50000)小区间(包含在大区间内),问最多有多少个小区间有重合部分(端点也算)。第一行输入n,表示有n个小区间,接下来n行输入小区间的起点和终点。输出为1行,即最多多少个小区间有重合部分。样例输入43 54 81 25 10样例输出3如果题目数据给的和善一点的话,我们可以用数组下标记录,最后统计这个数组中的...原创 2019-12-11 23:47:13 · 317 阅读 · 0 评论 -
埃氏筛法及其改进
#埃氏筛法原理:如果一个数是质数,那么他的倍数必是合数,所以我们在碰到质数的时候把他的倍数全都标记为合数,那么没有被标记到的就是质数下面看代码(判定n以内的素数):const int N=1e7+5;bool ok[N];int prim[N];int pos=0;void p(int n){ memset(ok,true,sizeof(ok)); ok[0]=ok...原创 2019-11-17 19:47:23 · 1062 阅读 · 0 评论 -
欧拉筛
#素数判定之欧拉筛欧拉筛是在埃氏筛法的优化版,它避免了一个数被重复地筛,比如在埃氏筛法中,30=215=310=5*6;那么每经过一个因子,30都会被筛一次,这就造成了重复筛,所以在欧拉筛中对这一问题进行了解决,即使每个合数都只被他的最小因子筛一次,这就达到了我们缩短时间的目的。下面来看代码。const int N=1e7+5;bool ok[N];int prim[N];int po...原创 2019-11-17 19:00:52 · 984 阅读 · 0 评论 -
快读
学长说这个快读更快。这个是读文件的,用的时候输完数据后按Ctrl Z回车结束。代码char *fs,*ft,buf[1<<20];#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;inline int read(){int x=0,f=1;ch...原创 2020-04-21 15:27:01 · 154 阅读 · 0 评论