【杂谈】初赛知识点
参考资料
CSP初赛知识点梳理 | 蔡勒公式及其推导 | 三种方式求递归时间复杂度 | 常用算法时间复杂度
1. 基础数论
-
计算日期
可以用可爱的蔡勒公式,首先给出定义:
\(c\) 是已经经过的世纪数,\(y\) 是世纪内的年份,\(m\) 是月份,\(d\) 是日期数,\(w\) 是星期。
比如:2022.9.14 中 \(c=20,y=22,m=9,d=14\),而 \(w\) 就是我们要求的。
于是蔡勒公式给出了一个求 \(w\) 的好方法:\(w=(\left\lfloor\dfrac{c}{4}\right\rfloor-2c+y+\left\lfloor\dfrac{y}{4}\right\rfloor+\left\lfloor\dfrac{13(m+1)}{5}\right\rfloor+d-1)\bmod 7\)。
特殊地,如果月份是 1 月或者 2 月,那么它要当成去年的 13 月或 14 月来计算。
例:计算 1976.1.17 是星期几?
将 1976 年 1 月转化成 1975 年 13 月,则 \(w=4-38+75+18+36+17-1=111\equiv6\pmod 7\),求出是星期六。
-
排列组合
\(A_n^m=\dfrac{n!}{(n-m)!}\):n 个元素中选出 m 个元素按顺序排列的方案数。
\(C_n^m=\dfrac{n!}{m!(n-m)!}\):n 个元素中选出 m 个元素的方案数(也就是不考虑顺序)。
2. 时间复杂度计算
-
主定理
目前我看到的有两种版本,参考资料里都有,我就不讲了(逃)
-
常见时间复杂度
邻接表和邻接矩阵遍历
下列情况对于 \(n\) 个点,\(m\) 条边的图。
邻接矩阵:\(O(n^2)\),对于每个点,都要将所有点访问一次。
邻接表:\(O(n+m)\),先访问所有 \(head\) 数组,再访问边。
Dijsktra
朴素:\(O(m+n^2)\)
二叉堆/优先队列优化:\(O((n+m)\log n)\)
斐波那契堆优化:\(O(m+n\ log n)\)
SPFA
平均:\(O(km)\),其中 \(k\) 为每个节点平均入队次数,一般为 4。
最坏:\(O(nm)\) 关于SPFA,它死了