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]);
}
}
}

大学OI复建
浙公网安备 33010602011771号