随笔分类 - 算法-数论
摘要:经典结论:长度为n的排列的逆序对数量的期望为C(n,2)/2。 简单证明:任意两个数在一个排列中,为逆序的概率是(1/2),选择两个数的方案为C(n,2)。 故长度为n的排列的逆序对数量的总和为n!*C(n,2)/2,其中,n!是排列的数量 例题:https://ac.nowcoder.com/ac
阅读全文
摘要:对一个数进行质因子分解的朴素做法是O(sqrt(n))的试除法 如果可以预处理出mindiv[i]数组,即每个数的最小质因子,则进行因式分解时,可以对数n,不断执行n/=mindiv[n],即可分解。 例题:https://ac.nowcoder.com/acm/contest/45670/E (此
阅读全文
摘要:基于分治的思想: 例题:https://www.acwing.com/problem/content/99/ 模板: 求num^0+num^1+...+num^k const int MOD=9901; int QuickExp(int base,int exp) { base%=MOD; int
阅读全文
摘要:1、SG函数 SG函数的定义:可以到达的全部点的SG函数中没有出现的最小自然数 可以解决棋子移动的博弈论问题 推导方式基于nim游戏,https://www.acwing.com/solution/content/15279/ https://www.acwing.com/problem/conte
阅读全文
摘要:对于求数学期望的问题: 由于数学期望的线性性质,一般用记忆化的形式,从后往前dp 例题:https://www.acwing.com/problem/content/description/220/
阅读全文
摘要:容斥原理的复杂度是2^n,一般n不会很大 形如: 由于容斥原理一共有2^n中选法,可以用二进制枚举,1表示选择某个条件。 然后将偶数个1的状态加起来,奇数个1的状态减去 例题: https://www.acwing.com/problem/content/216/ 莫比乌斯函数: 定义: 用于结合容
阅读全文
摘要:高斯消元求解n元线性方程组 原理 先变上三角,再变对角矩阵,则此时 右边的值就是方程的解 步骤: 模板:(n*n且保证有唯一解,即n个线性方程n个未知数且有唯一解) const int N=15; double A[N][N]; int n; void Gauss() { //A矩阵存储了系数和右端
阅读全文
摘要:卡特兰数的基本模型是,(0,0)->(n,n)且不越过x=y这条线 等价于另一个模型:01序列且全部前缀中0的个数都大于1,其中0对应于x方向移动,1对应y方向移动 例题:https://www.acwing.com/problem/content/1318/ 此题可以将一个1-n的前缀的选择(选择
阅读全文
摘要:模板: int primes[N],cnt; bool not_prime[N]; void Init() { for(int i=2;i<N;i++) { if(!not_prime[i]) { primes[cnt++]=i; for(int j=i+i;j<N;j+=i) { not_prim
阅读全文
摘要:lucus求解组合数的时间复杂度为 O(MODlogn(MOD)) 适用于MOD较小但n较大的情况 模板: LL MOD=1e6+3; LL QuickExp(LL base,LL exp) { LL res=1; while(exp) { if(exp&1) { res*=base; res%=M
阅读全文
摘要:n个箱子k个小球 1、不可空: k个小球共有k-1个空隙,k-1个空隙中选n-1个位置放入隔板,形成n个箱子 答案为C(k-1,n-1) 2、可空 k个小球和n-1个隔板,选取k个位置放小球,并形成n个箱子 答案为C(n+k-1,k)
阅读全文
摘要:对正整数a和b, a%b的值: b>a: 则a%b=a a>=b>=a/2: 则a%b=a-b<=a/2 b<=a/2: 则a%b<b<=a/2 可以发现 在b<=a时,一次取模运算至少会将a/2,a的变化情况为log次。
阅读全文
摘要:可以用快速幂的形式求大量的相同矩阵乘法。 1、快速幂求斐波那契数列的第n项(n很大) 先将斐波那契数列的递推转化成矩阵形式 然后用快速幂求解A^n 例题:求斐波那契数列的前n项和(n很大) 可以将上例的行向量变为Fn=(fn,fn+1,Sn),矩阵A变为{{0,1,0}, {1,1,1}, {0,0
阅读全文
摘要:注意这里是构造了一个解,ti由于Mi与mi互质,可以用ExGCD求解 例题:https://www.acwing.com/problem/content/1300/ 模板: #include<bits/stdc++.h> using namespace std; typedef long long
阅读全文
摘要:在求a*b%MOD的时候,如果MOD>1e10,则即便使用a%MOD*b%MOD,依旧有可能会爆long long 故可以利用和快速幂相似的思想,将乘法按位转化为加法,避免报long long 龟速乘模板: LL SlowMul(LL a,LL k,LL MOD) { LL res=0; while
阅读全文
摘要:拓展欧几里得算法: 1、模板:https://www.cnblogs.com/ydUESTC/p/16676229.html 2、原理: 3、应用:拓展欧几里得算法解线性同余方程: 4、例题: (1)线性同余方程: https://www.acwing.com/problem/content/205
阅读全文
摘要:对获取所有约数有一个优化。 首先朴素的作法是,枚举sqrt(n)。 但是实际上,2e9范围以内的数字最多有1600个约数,但是sqrt(n)会到达50000左右。 对于多组测试数据, 可以考虑先筛sqrt(n)以内的质数,然后对num进行质因子分解O(sqrt(n)/ln(sqrt(n)))<O(s
阅读全文
摘要:例题: 1、求区间中的质数 筛质数是O(n)或O(nloglogn) 但是如果n很大,则会超时。 但是如果要筛[l, r]区间中的全部质数 且l和r比较大,但是r-l比较小时。 可以用O(nloglogn)的时间筛出,其中n=sqrt(N)。可以降低时间复杂度。 有对一个数n,如果是合数,则一定有小
阅读全文
摘要:问题:求和:1^k+2^k+...+n^k 例题: https://codeforces.com/contest/622/problem/F 代码: #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #defin
阅读全文
摘要:exgcd用于计算,形如ax+by=c的解。 证明:参考:https://www.cnblogs.com/mrclr/p/9380300.html 1、利用exgcd求解ax0+by0=gcd(a,b)的一个解: LL ExGCD(LL a, LL b, LL &x, LL &y) { if (b
阅读全文