OI复建(知识点)

注意事项

\(1.\) 注意数据范围,看是否要开 unsigned long long
\(2.\) 注意重边

快速幂

\(a^b\),通过把 \(b\) 二进制分解后,可以看成是多个 \(a\) 的幂次相乘就行了。

inline int ksm(int a, int b, int p) {
	int base = a, res = 1;
	while(b) {
		if(b & 1) res = (res * base) % p;
		base = (base * base) % p, b >>= 1;
	}
	return res;
}

编译选项

-Wall -Wl,--stack=123456789 -std=c++14 -O2

素数筛

详见我之前的数学博客

最短路

Floyd

\(f[k][x][y]\) 表示只经过 \(1 - k\) 这些点,从 \(x-> y\) 的最短路。

显然有 \(f[k][x][y] = \min{(f[k - 1][x][y], f[k][x][k] + f[k][k][y])}\)

枚举的话时空复杂度都是 \(n^3\) 级别的,考虑到每一轮都只用到了 \(k\)\(k - 1\),与前面的无关,所以将第一维滚动掉降低空间复杂度。

for(int k = 1; k <= n; k++) {
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
		}
	}
}
posted @ 2024-11-05 16:28  TLE_Automation  阅读(35)  评论(1)    收藏  举报