2023年寒假集训

2023.1.27

开了数论,开始学习高斯消元。
上午学会了高斯消元和高斯约旦消元法,做了道板子,学习了高斯约旦消元法的判断无解和无穷解。

很久没有使用过浮点数,犯了好几次与 0 比较的错误。
应该是与一个极小的浮点数比较来判断该浮点数是否为 0。

高斯消元第二道球形空间生成器,要求找球心。

但有不少二次项,后来推导发现二次项其实都可以消掉,然后当成线性方程组做就可以了。

但还有一个问题是多了个半径的平方这个未知数,但考虑实际上这个线性方程组是有唯一解的。

那么是不是可以将这个半径的平方的系数当做一个线性方程组中的系数呢?答案是可以的,然后就 \(AC\) 了。

写了一篇博客
高斯-约旦消元法详解

2023.1.28

开了专题扩展欧几里得,学习不定方程的解。

开始看数论基础知识,做了前两道题。

第二道卡住了好久,对于不定方程求解还是中出现了三个未知数并且存在两次项没搞懂。

后来分别分析题目中可以化为同余表达式或者不定方程的三个式子,写出了。

目前还卡在第三道。

2023.1.29

今天还在做扩展欧几里得,学了逆元。

上午快结束的时候奆佬 Trump_ 搞出一个 hack 数据,把我的代码 hack 掉了。

然后就开始搞这道关于 \(tarjan\) 的题,墨迹了一下午,终于发现问题在于 DFS,最终发现做法不对,改了做法。

晚上一直在肝一道叫洗牌的题,看了好久结果因为算错了而没找到规律。

2023.1.30

洗牌 AC 了,主要在于牌初始位置的线性同余方程,确定了洗牌中有一个空位后就知道了模数应当是 n+1,而不是我最初认为的 \(n\)。后面就是简单的求解,不做赘述。

开始复习线段树,线段树板子改了半小时。

问题在于 mid 赋值时写成了 (left + right)>>1,实际上应该是 (t[id].l + t[id].r)>>1

观察自己以前的提交记录,发现这个问题在第一次学线段树的时候就犯过,在此记录。

改了一下午扩展欧几里得 二元一次不定方程,这是以前做过改了一小时放弃的题。

这道题是主要是对于线性同余方程的求解,包括有无解、解的数量、最小最大正整数解一类的问题。

于是我根据《算法导论》以及一些博客总结了一些常用的定理和推论线性同余方程求解。明后天可能会补上证明过程。

晚上学习欧拉函数,学习了欧拉函数各个性质及其证明,以及线性筛求欧拉函数。

2023.1.31

一上午肝了道 仪仗队

这道题目给出一个 \(n \times n\) 的点阵

对于这个点阵

我们从左下角到右上角画一条斜线

分离左上部分和右下部分

然后我们可以发现这个点阵是根据这条对角线对称的

对于这条对角线

我们从右上角开始

对其经过的点依次进行标号

最后发现有 n 个点

第 1 个和第 n 个处于最角上(其中一个还是自己)

不可能看到

对于对角线上剩下的点依次进行分析

我们已知这条线上的点是看不到的(坐标点右上角那一个点除外,单独分析)

· · · · · 1
· · · · 2 ·
· · · 3 · ·
· · 4 · · ·
· 5 · · · ·
6 · · · · ·

我们可以发现
其中一部分与该编号的点是可以看到的点
因此
最终是求 2 到 n-1 互质的个数。

下午在做 Longge的问题
\(\gcd(i,n)\) 一定是 \(n\) 的约数

我们可以枚举每个约数 \(p\)

再求出使 \(\gcd(i,n)\) 的值为 \(p\)\(i\) 的个数 \(num\)

\(ans = p*num\) 的和

因此求出对于每个 \(p\) 满足要求的 \(i\) 的个数

\(f(p)\) 为满足 \(\gcd(i,n) = p\)\(i\) 的个数

因为 \(\gcd(i,n) = p\) ,则 \(\gcd(i/p,n/p) = 1\),

\(f(p) = eular(n/p)\)

找到了 \(i/p\) 的个数,\(p\) 值一定,\(i\) 的个数也就找到了。

2023.2.1

学习排列组合,复习了高精度模板。

帮助别人学习了 \(lca\),自己顺便复习了一下。

学习卢卡斯定理,做了模板题【模板】卢卡斯定理

学会了费马小定理求逆元和组合数取模的问题。

写了一篇卢卡斯定理证明的博客

晚上复习了初中时候学过已经忘记的错排问题

然后继续看排列组合没看完的部分,正在写博客记录。

2023.2.2

上午继续做排列组合,AC 一道蓝题排列计数

这道题其实相当于求满足小根堆性质的排列数。

该节点方案数 \(=\) 从该节点的子节点中选出左子树的方案数 \(\times\) 左节点方案数 \(\times\) 右节点方案数。

然后直接求就可以了。

下午学习分块,先做了一道分块模板题数列分块入门 4

这道题是区间求和、区间查询。

先预处理出每个块的区间和,在整块值改变时先不进行遍历改变,而是先用一个数组记录下来。

等以后如果有查询这个块时候可以加上。

分块虽然看上去很朴素,不过复杂度还是很可观的。

然后是一道 弹飞绵羊

这道题我看到第一时间觉得是树,因为每个点都有一个单向的指向,且永远不会产生环。

题中的修改操作就是删边再连边。

不过经过简单的计算,在我已知的算法里好像用树做这道题都会炸。

然后就想到分块,用分块记录每个点跳出块的步数和跳出块后的步数。

这样每次修改、查询复杂度为 \(\Theta(\sqrt{n})\)

晚上开始做数列分块入门 9,也有一道相同的叫 蒲公英

这道题主要求区间众数,不过没有修改。

对于区间众数,可以提前处理出来每个块的众数,再类似上面的方法操作。

2023.2.3

改了一上午区间众数,中午前终于改出来了,两百行多行的代码,正是代码能力弱小的我不擅长的。

下午复习了一下二分答案,修改了一篇以前写错的题解(数据太水了,没测出来)。

打算继续做分块,如果晚上还有时间的话学一下莫队。

posted @ 2023-01-27 18:41  -白简-  阅读(26)  评论(2编辑  收藏  举报