修复 ManimGL 中的 SVGMobject
今天一天都在修 ManimGL 里的 SVGMobject,还是比较有收获的,写篇文章记录一下
起因是 fran 给了一个在 ManimGL 里表现怪异的 svg 文件:formula.svg
今天一天都在修 ManimGL 里的 SVGMobject,还是比较有收获的,写篇文章记录一下
起因是 fran 给了一个在 ManimGL 里表现怪异的 svg 文件:formula.svg
纠错字(error correction codewords)可以纠正两种错误,一种是比如无法扫描或无法解码的已知位置的错误字(erasures),一种是未知位置的错误字(errors),一个 erasures 可以由一个纠错字纠错,而一个 errors 需要两个纠错字来纠错
最近几次比赛遇到过好几次二维码的题目,打算好好来读一读标准文档 ISO/IEC 18004:2015
文档 6.1 前面的内容不多,就从它后面开始记了
Haskell中的函子单子等都与范畴论(category theory)有很多联系,所以打算简单了解一下范畴论的相关内容。
范畴论是数学的一门学科,以抽象的方法处理数学概念,将这些概念形式化成一组组的“物件”及“态射”。数学中许多重要的领域可以形式化为范畴。使用范畴论可以令这些领域中许多难理解、难捉摸的数学结论更容易叙述证明。
———— 维基百科
范畴本质上是一个简单的集合,一个范畴$\mathbf{C}$包含三个组成成分:
半群(semigroup)是一个集合$S$,它需要指定一个二元运算符$\oplus$,并且满足
$$
a\oplus b \in S\quad a, b\in S
$$
以及结合(associative)律:
$$
(a\oplus b)\oplus c = a\oplus (b\oplus c)
$$
这个二元运算符在Haskell的Semigroup中被定义为<>
函数:
函子(Functor)是一个类型类(typeclass),和其他类型类一样,它规定了其实例类必须实现的功能(例如Eq类型类规定了它的实例必须是可以比较是否相等的),Functor规定类它的实例必须是可以进行映射的。Functor要求使用fmap
:: (a -> b) -> f a -> f b 函数来实现这个功能,它接收一个a -> b类型的函数、一个内部元素为a类型的函子,返回一个内部元素为b类型的函子
Haskell有一个静态类型系统,任何变量、函数都会具有类型,并且有类型判断功能,没给出的类型会自动识别。
Type的首字母全为大写,常用的有:
Int
:整型,有上下界范围,-2147483647~2147483648Haskell中的函数是柯里化(Currying)的,可以看作所有函数都只接收一个参数,而接收两个参数的函数实际上是这个函数接收了第一个参数后返回了一个接收第二个参数的函数,然后用这个函数接收第二个参数,返回最终的结果。比如max函数,它的类型签名是:
学习一门新语言之Haskell
之前一直很好奇函数式编程,觉得Haskell挺有意思的,想学学
现在高考完放假了,可以有时间具体学一学了
这里没有Haskell的教程,只有我在学习Haskell时写下的笔记
在使用manim时,对于Text类,会有一些bug,我尝试修复了它们
shaders
分支下无法使用Text类ORIGIN
的位置,导致Transform
时会有字符在原位置和ORIGIN
之间 这些问题已经通过#1030修复到了manim的master分支中
通过SPOJ 10707 COT2-Count on a tree II这道题目来学习一下 树上莫队
当需要离线查询 树上 的多区间问题时,可以使用 树上莫队 来解决
主要通过 欧拉序 将树转化为一条链,然后在链上执行普通莫队的操作
通过AtCoder 1219 歴史の研究这道题目来学习一下 回滚莫队
回滚莫队 适用于容易进行add
操作,而不容易实现del
的情况
通过莫队的分块,指针移动的思想,可以让左指针进行回滚操作, 近似 达到del
的效果
通过Luogu P1903 数颜色/维护序列这道题目来学习一下 带修莫队
顾名思义,带修莫队 不仅要支持普通莫队的查询操作,还要支持数据中途的修改
比如这道题目,需要实现以下目标
达到这个目标,可以在普通莫队的基础上加一个时间维度,实现 带修莫队
这篇文章来记录一下莫队算法时间复杂度的简单(不严谨)计算
首先分析一下莫队算法的时间复杂度有哪些方面构成
Query
数组的排序这篇文章是在写 manim教程系列视频 的 颜色 部分时做的一些笔记,包括 整个视频的结构 和 写代码时了解的一些用法的笔记
视频已经发布,地址:BV1vZ4y1x7hT
$dsu\ on\ tree$($disjoint\ set\ union\ \text{on tree}$)算法,也称 __树上并查集__。使用了并查集的按秩合并(启发式合并)的方法,结合 树链剖分 中的 轻重儿子划分 ,对 树上暴力统计 进行了优化。使用这个算法需要满足以下两个条件:
左偏树($Leftist\ Tree$),是一种 __可以合并的堆状结构__,支持以下操作
树状数组($Binary\ Indexed\ Trees$)是一个维护__前缀和__的数据结构,需要支持以下操作
模板地址: GitHub
1 | LL gcd(LL a, LL b) { |
lcm(a, b) = a / gcd(a, b) * b
目标: 寻找一对整数$(x, y)$,使$ax+by=gcd(a,b)$
1 | void exgcd(LL a, LL b, LL& d, LL& x, LL& y) { |
$ax+by=c$且$x,y$全为正整数,则当且仅当$gcd(a, b)|c$
1 | bool vis[maxn]; |
1 | void getprime(int n) { |
$$
\pi(x) \sim \frac{x}{\ln x}
$$
原理:费马小定理
若$a^{n-1}\equiv 1\pmod n$,$a$取值越多,可以近似认为$n$为质数
使用二次探测定理改进卡卡迈尔数(合数$n$对于任何正整数$b$,都满足$gcd(b, n)=1\ \ b^{n-1}\equiv 1\pmod n$)的bug
1 | LL Random(LL n) { return (LL)((double)rand() / RAND_MAX * n + 0.5); } |
$$
(a + b)\bmod n = ((a\bmod n) + (b\bmod n))\bmod n\\
(a - b)\bmod n = ((a\bmod n) - (b\bmod n) + n)\bmod n\\
ab\mod n = (a\bmod n)(b\bmod n)\bmod n
$$
1 | LL mul_mod(LL a, LL b, LL n){ |
1 | LL pow_mod(LL a, LL p, LL n) { |
使用位运算:
1 | LL pow_mod(LL a, LL p, LL n) { |
$$\varphi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})…(1-\frac{1}{p_k})$$
$\varphi(n)$表示不超过$n$且与$n$互质的整数个数
1 | int euler_phi(int n) { |
1 | int phi[maxn]; |
若$gcd(a, n) = 1$,则$a^{\varphi(n)}\equiv 1\pmod n$
若$p$为质数,则$a^{p-1}\equiv 1\pmod p$
若$p$为质数,则$(p-1)!\equiv -1\pmod p$
$$a\div b\bmod n = a\times b^{-1}\bmod n$$
$b^{-1}$称为$b$在模$n$意义下的逆元
使用费马小定理, $a^{-1} = a^{n - 2}$
递归求解
1 | LL inv(LL a, LL n) { |
1 | int inv_table[maxn]; |
$ax\equiv b\pmod n$可以化为$ax+ny=b$使用扩展欧拉定理解决
求解$x\equiv a_i\pmod {m_i}$满足$m_i$两两互质
1 | LL crt(int n, int* a, int* m) { |
$m_i$不一定两两互质
1 | LL excrt(LL n, LL* a, LL* m) { |
求解$a^x\equiv b\pmod n$满足$n$为质数
1 | int log_mod(int a, int b, int n) { |
整除分块可以对后面的莫比乌斯反演提供很大的优化
通过枚举可以发现$\lfloor \frac{n}{i} \rfloor$的结果会出现分块现象
例如$n=10$时
$\ \ \ i\ \ \ \ 1\ \ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\ 11\ 12\ 13\ …$
$\lfloor \frac{n}{i} \rfloor\ 10\ 5\ 3\ 2\ 2\ 1\ 1\ 1\ 1\ 1\ \ \ 0\ \ \ 0\ \ \ 0\ \ \ …$不难发现,每个块的右端点为$r=\lfloor \frac{n}{t}\rfloor (t=\lfloor \frac{n}{i}\rfloor)$
$$
\mu(n) =
\begin{cases}
1, & n=1 \\
(-1)^r, & n=p_1p_2p_3…p_r(\text{$p_i$为互不相同的质数}) \\
0, & else
\end{cases}
$$
性质:
$$\sum_{d|n}{\mu(d)}=[n=1]$$
$$\sum_{d|n}{\frac{\mu(d)}{d}}=\frac{\varphi(n)}{n}$$
线性筛:
1 | int mu[maxn], vis[maxn]; |