【杂谈】初赛知识点

参考资料

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,它死了

posted @ 2022-09-14 11:50  Cloote  阅读(26)  评论(0编辑  收藏  举报