ACM模板

1.快速幂(取模)

ll qpow(ll a, ll b, ll k){
	ll ans = 1;
	while(b){
		if(b & 1) ans = (ans % k) * (a % k) % k;
		ans %= k;
		a = (a % k) * (a % k) % k;
		b >>= 1;
	}
	return ans %= k;
}

2.组合数(逆元)

ll c(ll n, ll m){
	if(n < m) return 0;
	else return f[n] * qpow(f[n - m], mod - 2) % mod * qpow(f[m], mod - 2) % mod;
}

3.快速排序

void qsort(int l, int r){
	int mid = a[(l + r) / 2];
	int i = l;
	int j = r;
	while(i <= j){
		while(mid > a[i]) i++;
		while(mid < a[j]) j--;
		if(i <= j){
			swap(a[i], a[j]);
			i++;
			j--;
		}
	}
		if(l < j) qsort(l, j);
		if(i < r) qsort(i, r);
}

4.树状数组

int lowbit(int x){
	return x & (-x);
}

void add(int i, int k){
	while(i <= n){
		c[i] += k;
		i += lowbit(i);
	}
}

int sum(int i){
	int ans = 0;
	while(i > 0){
		ans += c[i];
		i -= lowbit(i);
	}
	return ans;
}

5.高精度乘法

int lena = strlen(a1);
	int lenb = strlen(b1);
	for(int i = 1; i <= lena; i++) a[i] = a1[lena - i] - '0';
	for(int i = 1; i <= lenb; i++) b[i] = b1[lenb - i] - '0';
	for(int i = 1; i <= lena; i++){
		for(int j = 1; j <= lenb; j++){
			c[i + j - 1] += a[i] * b[j];
		}	
	}
	int len = lena + lenb;
	for(int i = 1; i <= len; i++) if(c[i] > 9){
		c[i + 1] += c[i] / 10;
		c[i] = c[i] % 10;
	}
	while(c[len] == 0 && len > 1) len--;
	for(int i = len; i >= 1; i--) printf("%d", c[i]);

6.并查集

int query(int x){
	if(f[x] == x) return x;
	else return query(f[x]);
}

void merge(int x, int y){
	int f1 = query(x);
	int f2 = query(y);
	if(f1 != f2) f[f1] = f2;
} 

7.线性筛(O(N))

void getprime(int n){
	memset(isprime, 1, sizeof(isprime));
	isprime[1] = 0;
	int cnt = 0;
	for(int i = 2; i <= n; i++){
		if(isprime[i]) prime[++cnt] = i;
			for(int j = 1; j <= cnt && prime[j] * i <= n; j++){
				isprime[prime[j] * i] = 0;
				if(i % prime[j] == 0) break;
		}
	}
}

8.克鲁斯卡尔(求最小生成树)

ll kruskal(){
	for(int i = 1; i <= n; i++) f[i] = i;
	ll res = 0;
	int cnt = 0;
	for(int i = 1; i <= m; i++){
		int a = find(e[i].u), b = find(e[i].v);
		if(a != b){
			f[a] = b;
			res += e[i].a;
			cnt++;
		}
	}
	if(cnt != n - 1) return 0;
	return res;
}

持续更新……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 图论 3 1.1 术语 3 1.2 独立集、覆盖集、支配集之间关系 3 1.3 DFS 4 1.3.1 割顶 6 1.3.2 桥 7 1.3.3 强连通分量 7 1.4 最小点基 7 1.5 拓扑排序 7 1.6 欧拉路 8 1.7 哈密顿路(正确?) 9 1.8 Bellman-ford 9 1.9 差分约束系统(用bellman-ford解) 10 1.10 dag最短路径 10 1.11 二分图匹配 11 1.11.1 匈牙利算法 11 1.11.2 KM算法 12 1.12 网络流 15 1.12.1 最大流 15 1.12.2 上下界的网络的最大流 17 1.12.3 上下界的网络的最小流 17 1.12.4 最小费用最大流 18 1.12.5 上下界的网络的最小费用最小流 21 2 数论 21 2.1 最大公约数gcd 21 2.2 最小公倍数lcm 22 2.3 快速幂取模B^LmodP(O(logb)) 22 2.4 Fermat小定理 22 2.5 Rabin-Miller伪素数测试 22 2.6 Pollard-rho 22 2.7 扩展欧几里德算法extended-gcd 24 2.8 欧拉定理 24 2.9 线性同余方程ax≡b(mod n) 24 2.10 中国剩余定理 25 2.11 Discrete Logging(BL == N (mod P)) 26 2.12 N!最后一个不为0的数字 27 2.13 2^14以内的素数 27 3 数据结构 31 3.1 堆(最小堆) 31 3.1.1 删除最小值元素: 31 3.1.2 插入元素和向上调整: 32 3.1.3 堆的建立 32 3.2 并查集 32 3.3 树状数组 33 3.3.1 LOWBIT 33 3.3.2 修改a[p] 33 3.3.3 前缀和A[1]+…+A[p] 34 3.3.4 一个二维树状数组的程序 34 3.4 线段树 35 3.5 字符串 38 3.5.1 字符串哈希 38 3.5.2 KMP算法 40 4 计算几何 41 4.1 直线交点 41 4.2 判断线段相交 41 4.3 三点外接圆圆心 42 4.4 判断点在多边形内 43 4.5 两圆交面积 43 4.6 最小包围圆 44 4.7 经纬度坐标 46 4.8 凸包 46 5 Problem 48 5.1 RMQ-LCA 48 5.1.1 Range Minimum Query(RMQ) 49 5.1.2 Lowest Common Ancestor (LCA) 53 5.1.3 Reduction from LCA to RMQ 56 5.1.4 From RMQ to LCA 57 5.1.5 An<O(N), O(1)> algorithm for the restricted RMQ 60 5.1.6 An AC programme 61 5.2 最长公共子序列LCS 64 5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67 5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列生成 71 6.3 逆序 72 6.3.1 归并排序求逆序 72 7 数值分析 72 7.1 二分法 72 7.2 迭代法(x=f(x)) 73 7.3 牛顿迭代 74 7.4 数值积分 74 7.5 高斯消元 75 8 其它 77

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值