From 9b869166fe9722891549ce6da7e778601436250d Mon Sep 17 00:00:00 2001 From: YttriumWillow Date: Wed, 29 Nov 2023 17:05:14 +0800 Subject: [PATCH] Site updated: 2023-11-29 17:05:14 --- 2023/10/26/Test-Article/index.html | 2 +- .../index.html" | 49 ++++-- .../index.html" | 2 +- .../index.html" | 58 +++++-- .../index.html" | 16 +- .../index.html" | 2 +- .../index.html" | 4 +- .../index.html" | 141 ---------------- 2023/11/29/hello-world/index.html | 2 +- archives/2023/10/index.html | 2 +- archives/2023/11/index.html | 2 +- archives/2023/index.html | 2 +- archives/index.html | 2 +- categories/OI/index.html | 107 ++++++++---- categories/index.html | 2 +- .../\345\215\232\345\256\242/index.html" | 2 +- content.json | 2 +- index.html | 154 +++++++++--------- tags/OI/index.html | 107 ++++++++---- tags/index.html | 2 +- "tags/\345\215\232\345\256\242/index.html" | 2 +- 21 files changed, 328 insertions(+), 334 deletions(-) delete mode 100644 "2023/11/29/Hexo Icarus 5.1 \346\211\213\346\212\212\346\211\213\346\220\255\345\273\272\346\225\231\347\250\213/index.html" diff --git a/2023/10/26/Test-Article/index.html b/2023/10/26/Test-Article/index.html index 939f49d..ca496c9 100644 --- a/2023/10/26/Test-Article/index.html +++ b/2023/10/26/Test-Article/index.html @@ -51,7 +51,7 @@ enableHotKey: true, language: "zh-CN", }) - gitalk.render('comment-container')
P5377 [THUPC2019] 鸽鸽的分割 题解

P5377 [THUPC2019] 鸽鸽的分割 题解

简要题意

连结圆上 $n$ 个点,求最多能够把圆分成几个部分。

-

前置知识

欧拉公式:$F(ace)=E(dge) - V(ertex)+2$

-

人话:$\text{多边形面数} = \text{边数} - \text{顶点数} + 2$

+

P5377 [THUPC2019] 鸽鸽的分割 题解

简要题意

连结圆上 \(n\) 个点,求最多能够把圆分成几个部分。

+

前置知识

欧拉公式:\(F(ace)=E(dge) - V(ertex)+2\)

+

人话:\(\text{多边形面数} = \text{边数} - \text{顶点数} + 2\)

思路

将一个圆折叠成一个多面体,你可以进行一些奇妙的空间变换来达到这一点。

那么我们最后会多出一个底面。

-

因此在我们的这个圆中 $F(n)=E-V+1$

-

求 $V$

圆上已经有了 $n$ 个点。我们要使得圆内不存在三线共点的情况。

+

因此在我们的这个圆中 \(F(n)=E-V+1\)

+

求 \(V\)

圆上已经有了 \(n\) 个点。我们要使得圆内不存在三线共点的情况。

那么考虑每次选择四个顶点画出一个四边形的两条对角线。

-

于是又会生成 $C_{n}^{4}$ 个顶点。可以证明已经考虑完全了,于是有

-

$$
V = n + C_{n}^{4}
$$

-

求 $E$

原有 $C_{n}^{2}$ 条边,且圆环上的 $n$ 个点互相连接构成 $n$ 条边。

-

每多一个交点会增加两条多边形边。又有 $2\times C_{n}^{4}$ 条。

-

$$
E = n + C_{n}^{2} + 2\times C_{n}^{4}
$$

+

于是又会生成 \(C_{n}^{4}\) 个顶点。可以证明已经考虑完全了,于是有

+
+$$ +V = n + C_{n}^{4} +$$ +
+ +

求 \(E\)

原有 \(C_{n}^{2}\) 条边,且圆环上的 \(n\) 个点互相连接构成 \(n\) 条边。

+

每多一个交点会增加两条多边形边。又有 \(2\times C_{n}^{4}\) 条。

+
+$$ +E = n + C_{n}^{2} + 2\times C_{n}^{4} +$$ +
+

最后,我们展开这个逆天的柿子:

-

$$
\begin{aligned}
F(n) &= E - V + 1 \
&= n + C_{n}^{2} + 2\times C_{n}^{4} - n - C_{n}^{4} + 1 \
&= C_{n}^{2} + C_{n}^{4} + 1 \
&= \dfrac{n(n - 1)}{2} + \dfrac{n(n - 1)(n - 2)(n - 3)}{4\times 3 \times 2} + 1 \
&= \dfrac{x^4}{24} - \dfrac{x^3}{4} + \dfrac{23x^2}{24} - \dfrac{3x}{4} + 1
\end{aligned}
$$

+
+$$ +\begin{aligned} + F(n) &= E - V + 1 \\ + &= n + C_{n}^{2} + 2\times C_{n}^{4} - n - C_{n}^{4} + 1 \\ + &= C_{n}^{2} + C_{n}^{4} + 1 \\ + &= \dfrac{n(n - 1)}{2} + \dfrac{n(n - 1)(n - 2)(n - 3)}{4\times 3 \times 2} + 1 \\ + &= \dfrac{x^4}{24} - \dfrac{x^3}{4} + \dfrac{23x^2}{24} - \dfrac{3x}{4} + 1 +\end{aligned} +$$ +
+

去 OEIS 上校验结果,正确。

-
作者

YttriumWillow

发布于

2023-10-27

更新于

2023-11-04

许可协议

评论

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

P9816 少项式复合幂 题解

P9816 少项式复合幂 题解

简要题意

称一个项数小于等于 $20$ 的多项式为一个少项式

-

求一个少项式的 $y$ 次复合函数在 $x$ 点上 $f_{y}(x)\bmod p$ 的值。

-

解题思路

题目强调注意 $m,p$ 的范围,观察发现 $p$ 的范围在 $10^5$ 之内。

+
P9816 少项式复合幂 题解

P9816 少项式复合幂 题解

简要题意

称一个项数小于等于 \(20\) 的多项式为一个少项式

+

求一个少项式的 \(y\) 次复合函数在 \(x\) 点上 \(f_{y}(x)\bmod p\) 的值。

+

解题思路

题目强调注意 \(m,p\) 的范围,观察发现 \(p\) 的范围在 \(10^5\) 之内。

关于模运算,它拥有以下显然的性质:

-

$$
(x + y)\bmod p = (x\bmod p + y\bmod p)
$$

-

$$
(x \times y)\bmod p = ((x\bmod p)\times (y\bmod p))\bmod p
$$

-

所以对于一个多项式函数有等式 $f(x) \bmod p = f(x\bmod p)\bmod p$ 存在。不明白的想想你的快速幂为什么对。

-

$$
f(x)\bmod p = \sum_{i = 1}^{m} a_i x^{b_i} \bmod p = \sum_{i = 1}^{m} (a_i (x\bmod p)^{b_i} \bmod p) \bmod p
$$

-

如上柿我们可以用 $O(m\log\max{b})$ 的时间预处理出所有 $0\le x < p$ 的 $f(x)\bmod p$,$O(1)$ 地快速进行回答。

-

然后应该初学者都能想到通过 $y$ 次迭代求得 $f_y(x)\bmod p$,关键在于将迭代的复杂度降低。

-

考虑进行倍增,因为有 $f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))$。

-

令 $st_{x,k} = f_{2^k}(x)$ 则我们可以通过 $O(\log y)$ 的迭代求得答案。

-

$$
st_{x,k} =
\begin{cases}
f(x)\bmod p & k = 0 \
st_{st_{x,k - 1},k - 1} & \mathrm{Otherwise.}\
\end{cases}
$$

-

需要注意的是,因为 $y\le 10^7$,因此枚举 $k$ 直到 $2^k > 10^7$。

-

贴个代码

这里令 $f_{x,k} = st_{x,k}$。

+
+$$ +(x + y)\bmod p = (x\bmod p + y\bmod p) +$$ +
+ +
+$$ +(x \times y)\bmod p = ((x\bmod p)\times (y\bmod p))\bmod p +$$ +
+ +

所以对于一个多项式函数有等式 \(f(x) \bmod p = f(x\bmod p)\bmod p\) 存在。不明白的想想你的快速幂为什么对。

+
+$$ +f(x)\bmod p = \sum_{i = 1}^{m} a_i x^{b_i} \bmod p = \sum_{i = 1}^{m} (a_i (x\bmod p)^{b_i} \bmod p) \bmod p +$$ +
+ +

如上柿我们可以用 \(O(m\log\max{b})\) 的时间预处理出所有 \(0\le x < p\) 的 \(f(x)\bmod p\) \(O(1)\) 地快速进行回答。

+

然后应该初学者都能想到通过 \(y\) 次迭代求得 \(f_y(x)\bmod p\) 关键在于将迭代的复杂度降低。

+

考虑进行倍增,因为有 \(f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))\)

+

令 \(st_{x,k} = f_{2^k}(x)\) 则我们可以通过 \(O(\log y)\) 的迭代求得答案。

+
+$$ +st_{x,k} = +\begin{cases} + f(x)\bmod p & k = 0 \\ + st_{st_{x,k - 1},k - 1} & \mathrm{Otherwise.} \\ +\end{cases} +$$ +
+ +

需要注意的是,因为 \(y\le 10^7\) 因此枚举 \(k\) 直到 \(2^k > 10^7\)。

+

贴个代码

这里令 \(f_{x,k} = st_{x,k}\)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
constexpr int Y = 1e7 + 10;

rep (i, 0, p - 1)
rep (j, 1, m)
f[i][0] = (f[i][0] + 1ll * a[j] * fpow(i, b[j]) % p) % p;

for (int j = 1; (1 << j) <= Y; ++j)
rep (i, 0, p - 1)
f[i][j] = f[f[i][j - 1]][j - 1];

rep (i, 1, q)
{
cin >> x >> y; x %= p;
for (int k = 30; ~k; --k)
if ((1 << k) & y) x = f[x][k];
cout << x << endl;
}
-
作者

YttriumWillow

发布于

2023-10-29

更新于

2023-11-04

许可协议

评论

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

Manacher 算法学习笔记

Manacher 算法学习笔记

Manacher 算法于 1975 年发明,用其发明者的名字命名。

+
Manacher 算法学习笔记

Manacher 算法学习笔记

Manacher 算法于 1975 年发明,用其发明者的名字命名。

Manacher 是一个线性解决回文子串问题的算法。

Manacher 算法适用于处理字符串的所有回文子串,而并非只适用于通常意义上的最长回文子串,具体见下文解释。

前置知识

考虑如何描述一个字符串里的回文子串。

-

比较简单的想法是记该子串的左右端点,将其记为 $[l,r]$。
然而对于一个回文子串的子串 $[l+d,r-d]$ 它同样是一个回文子串;
除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。

-

另一个利用回文串性质的记法是记录其对称中心和对称长度。
例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 $[5,3]$。

+

比较简单的想法是记该子串的左右端点,将其记为 \([l,r]\)。
然而对于一个回文子串的子串 \([l+d,r-d]\) 它同样是一个回文子串;
除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。

+

另一个利用回文串性质的记法是记录其对称中心和对称长度。
例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 \([5,3]\)。

对于偶数长度的回文串,我们考虑在每两个字符间插入一个字符,例如 #
同时我们要在头尾插入一些指示字符,辅助下面算法的判断。
例如把上面的串变成:$D#B#A#B#C#B#A#B

-

通过上述记法结合回文串性质可以发现 $[5,2]$,$[5,1]$ 均为回文子串。
我们就可以小改以上这个记法为记录其对称中心和最大对称长度。
也就是说 $[5,3]$ 可以说明以 $5$ 为对称中心实际上存在 $3$ 个回文子串。

-

Manacher 可以用 $O(n)$ 的复杂度求出每一个对称中心的最长对称长度。
因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。

+

通过上述记法结合回文串性质可以发现 \([5,2]$,$[5,1]\) 均为回文子串。
我们就可以小改以上这个记法为记录其对称中心和最大对称长度。
也就是说 \([5,3]\) 可以说明以 \(5\) 为对称中心实际上存在 \(3\) 个回文子串。

+

Manacher 可以用 \(O(n)\) 的复杂度求出每一个对称中心的最长对称长度。
因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。

算法

考虑一个中心扩展算法。

Unfixed

-
作者

YttriumWillow

发布于

2023-11-02

更新于

2023-11-04

许可协议

评论

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

准备环境

    -
  • 安装nodejs✅
  • -
  • 安装git✅
  • -
  • 安装hexo✅
  • -
-
1
2
# 此为全局安装,可能需要sudo权限
npm install -g hexo-cli
- -

创建git仓库

直接在github主页创建一个新的仓库,此处假设仓库名称为blog_tensorrt

-

使用hexo建初始博客

首先初始化一个博客项目,此处blog可以换成自己想要起的名称。该操作之后在当前目录下会出现一个叫做blog的新的文件夹

-
1
hexo init blog
- -

进入blog文件夹下

-
1
cd blog
- -

可以看到当前的文件夹下有一个themes的文件夹,此时看到里面没有文件,下载icarus主题代码到其中

-
1
git clone git@github.com:ppoffice/hexo-theme-icarus.git /themes/icarus
- -

之后修改_config.yml文件,将theme修改为icarus

-
1
theme: icarus
- -

之后在命令行进行构建

-
1
hexo g
- -

输入生成命令可能会报错,提示有没有安装的包,安装确实的包

-
1
yarn add bulma-stylus@0.8.0 hexo-component-inferno@^1.1.0 hexo-pagination@^2.0.0 hexo-renderer-inferno@^0.1.3 inferno@^7.3.3 inferno-create-element@^7.3.3
- -

接着生成

-
1
2
# 该命令多执行几次,知道没有新的文件生成
hexo g
- -

查看网页初始效果

-
1
hexo s
- - -

自定义博客设计
此时博客目录下有文件_config.icarus.yml,修改该文件即可,每一项在icarus官网https://ppoffice.github.io/hexo-theme-icarus/Configuration/icarus%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97-%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/#more均有详细的说明,在此不做赘述。

-

部署网站
首先修改_config.yml文件

-

Site

title: eryoyo的博客
subtitle: 坚持✊
description: tensorrt笔记整理
keywords:
author: eryoyo
language: zh-CN
timezone: Asia/Shanghai

-

URL

Set your site url here. For example, if you use GitHub Page, set url as ‘https://username.github.io/project

url: https://eryoyo.github.io/blog_tensorrt
之后进行本地查看

-

hexo clean
hexo g
hexo s
网站可以在http://localhost:4000/blog_tensorrt里面查看到

-

之后接着修改_config.yml文件

-

deploy:
type: git
repo: git@github.com:eryoyo/blog_tensorrt.git
branch: master
安装部署需要的包

-

npm install hexo-deployer-git –save
之后部署

-

hexo deploy
在仓库里面setting里面修改github pages的none为master分支,点击save,等待一会之后就可以在访问自己刚刚部署到的网站了

-

主站建成。

-
作者

YttriumWillow

发布于

2023-11-29

更新于

2023-11-05

许可协议

评论

\ No newline at end of file diff --git a/2023/11/29/hello-world/index.html b/2023/11/29/hello-world/index.html index 146469b..1a03f1b 100644 --- a/2023/11/29/hello-world/index.html +++ b/2023/11/29/hello-world/index.html @@ -58,7 +58,7 @@

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

准备环境

    -
  • 安装nodejs✅
  • -
  • 安装git✅
  • -
  • 安装hexo✅
  • -
-
1
2
# 此为全局安装,可能需要sudo权限
npm install -g hexo-cli
- -

创建git仓库

直接在github主页创建一个新的仓库,此处假设仓库名称为blog_tensorrt

-

使用hexo建初始博客

首先初始化一个博客项目,此处blog可以换成自己想要起的名称。该操作之后在当前目录下会出现一个叫做blog的新的文件夹

-
1
hexo init blog
- -

进入blog文件夹下

-
1
cd blog
- -

可以看到当前的文件夹下有一个themes的文件夹,此时看到里面没有文件,下载icarus主题代码到其中

-
1
git clone git@github.com:ppoffice/hexo-theme-icarus.git /themes/icarus
- -

之后修改_config.yml文件,将theme修改为icarus

-
1
theme: icarus
- -

之后在命令行进行构建

-
1
hexo g
- -

输入生成命令可能会报错,提示有没有安装的包,安装确实的包

-
1
yarn add bulma-stylus@0.8.0 hexo-component-inferno@^1.1.0 hexo-pagination@^2.0.0 hexo-renderer-inferno@^0.1.3 inferno@^7.3.3 inferno-create-element@^7.3.3
- -

接着生成

-
1
2
# 该命令多执行几次,知道没有新的文件生成
hexo g
- -

查看网页初始效果

-
1
hexo s
- - -

自定义博客设计
此时博客目录下有文件_config.icarus.yml,修改该文件即可,每一项在icarus官网https://ppoffice.github.io/hexo-theme-icarus/Configuration/icarus%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97-%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/#more均有详细的说明,在此不做赘述。

-

部署网站
首先修改_config.yml文件

-

Site

title: eryoyo的博客
subtitle: 坚持✊
description: tensorrt笔记整理
keywords:
author: eryoyo
language: zh-CN
timezone: Asia/Shanghai

-

URL

Set your site url here. For example, if you use GitHub Page, set url as ‘https://username.github.io/project

url: https://eryoyo.github.io/blog_tensorrt
之后进行本地查看

-

hexo clean
hexo g
hexo s
网站可以在http://localhost:4000/blog_tensorrt里面查看到

-

之后接着修改_config.yml文件

-

deploy:
type: git
repo: git@github.com:eryoyo/blog_tensorrt.git
branch: master
安装部署需要的包

-

npm install hexo-deployer-git –save
之后部署

-

hexo deploy
在仓库里面setting里面修改github pages的none为master分支,点击save,等待一会之后就可以在访问自己刚刚部署到的网站了

-

主站建成。

-
通用快读快写模板

通用快读快写模板

Use these templates after using namespace std;

Update Info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Forked from Matrix_mlt[498779]
// + Original (原生功能)
// + Functions
// + read() // 2 Overloaded
// + readchar() // Non-overloaded
// + write() // Non-overloaded
// Pull Request from fengziyi[540226]
// + Submitted (已追加功能)
// + Functions
// + readln() // 2 Overloaded
// + writespace() // 2 Overloaded
// + writeln() // 4 Overloaded
// + New Buffer Reader
// + RePacked
// + Unsubmitted (待完善)
// + Float Number Reading Functions
// + Big Interger Functions
// + ...
+
通用快读快写模板

通用快读快写模板

Use these templates after using namespace std;

Update Info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Forked from Matrix_mlt[498779]
// + Original (原生功能)
// + Functions
// + read() // 2 Overloaded
// + readchar() // Non-overloaded
// + write() // Non-overloaded
// Pull Request from fengziyi[540226]
// + Submitted (已追加功能)
// + Functions
// + readln() // 2 Overloaded
// + writespace() // 2 Overloaded
// + writeln() // 4 Overloaded
// + New Buffer Reader
// + RePacked
// + Unsubmitted (待完善)
// + Float Number Reading Functions
// + Big Interger Functions
// + ...

Standard Version

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace IO
{
#define reg register
template<typename _Tp>
inline void read(_Tp& x)
{
x = 0; char c = getchar(); bool f = 0;
while (!std::isdigit(c)) f |= c == 45, c = getchar();
while ( std::isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
return f ? x = -x : 1, void();
}
template<typename _Tp>
inline void write(_Tp x)
{
static char stk[40]; int top = 0;
if (!x) return putchar(48), void();
if (x < 0) putchar(45), x = -x;
while (x) stk[top++] = x % 10, x /= 10;
while (top) putchar(stk[--top] + 48);
}
// read
template<typename _Tp, typename ...Args>
inline void read(_Tp& x, Args& ...args) { read(x), read(args...); }
}
using namespace IO;
@@ -113,50 +68,95 @@

Manacher 算法学习笔记

Manacher 算法学习笔记

Manacher 算法于 1975 年发明,用其发明者的名字命名。

+

Manacher 算法学习笔记

Manacher 算法学习笔记

Manacher 算法于 1975 年发明,用其发明者的名字命名。

Manacher 是一个线性解决回文子串问题的算法。

Manacher 算法适用于处理字符串的所有回文子串,而并非只适用于通常意义上的最长回文子串,具体见下文解释。

前置知识

考虑如何描述一个字符串里的回文子串。

-

比较简单的想法是记该子串的左右端点,将其记为 $[l,r]$。
然而对于一个回文子串的子串 $[l+d,r-d]$ 它同样是一个回文子串;
除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。

-

另一个利用回文串性质的记法是记录其对称中心和对称长度。
例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 $[5,3]$。

+

比较简单的想法是记该子串的左右端点,将其记为 \([l,r]\)。
然而对于一个回文子串的子串 \([l+d,r-d]\) 它同样是一个回文子串;
除非我们用较为复杂的方法记录这个回文子串的子串,否则需要用另外的空间来描述和储存,这造成了浪费。

+

另一个利用回文串性质的记法是记录其对称中心和对称长度。
例如对于字符串 DBABCBAB 中的子串 ABCBC,我们就可以记其为 \([5,3]\)。

对于偶数长度的回文串,我们考虑在每两个字符间插入一个字符,例如 #
同时我们要在头尾插入一些指示字符,辅助下面算法的判断。
例如把上面的串变成:$D#B#A#B#C#B#A#B

-

通过上述记法结合回文串性质可以发现 $[5,2]$,$[5,1]$ 均为回文子串。
我们就可以小改以上这个记法为记录其对称中心和最大对称长度。
也就是说 $[5,3]$ 可以说明以 $5$ 为对称中心实际上存在 $3$ 个回文子串。

-

Manacher 可以用 $O(n)$ 的复杂度求出每一个对称中心的最长对称长度。
因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。

+

通过上述记法结合回文串性质可以发现 \([5,2]$,$[5,1]\) 均为回文子串。
我们就可以小改以上这个记法为记录其对称中心和最大对称长度。
也就是说 \([5,3]\) 可以说明以 \(5\) 为对称中心实际上存在 \(3\) 个回文子串。

+

Manacher 可以用 \(O(n)\) 的复杂度求出每一个对称中心的最长对称长度。
因此,之前说有人对该算法存在误解,其实我们是可以知道所有回文子串的。

算法

考虑一个中心扩展算法。

Unfixed

-
P9816 少项式复合幂 题解

P9816 少项式复合幂 题解

简要题意

称一个项数小于等于 $20$ 的多项式为一个少项式

-

求一个少项式的 $y$ 次复合函数在 $x$ 点上 $f_{y}(x)\bmod p$ 的值。

-

解题思路

题目强调注意 $m,p$ 的范围,观察发现 $p$ 的范围在 $10^5$ 之内。

+
P9816 少项式复合幂 题解

P9816 少项式复合幂 题解

简要题意

称一个项数小于等于 \(20\) 的多项式为一个少项式

+

求一个少项式的 \(y\) 次复合函数在 \(x\) 点上 \(f_{y}(x)\bmod p\) 的值。

+

解题思路

题目强调注意 \(m,p\) 的范围,观察发现 \(p\) 的范围在 \(10^5\) 之内。

关于模运算,它拥有以下显然的性质:

-

$$
(x + y)\bmod p = (x\bmod p + y\bmod p)
$$

-

$$
(x \times y)\bmod p = ((x\bmod p)\times (y\bmod p))\bmod p
$$

-

所以对于一个多项式函数有等式 $f(x) \bmod p = f(x\bmod p)\bmod p$ 存在。不明白的想想你的快速幂为什么对。

-

$$
f(x)\bmod p = \sum_{i = 1}^{m} a_i x^{b_i} \bmod p = \sum_{i = 1}^{m} (a_i (x\bmod p)^{b_i} \bmod p) \bmod p
$$

-

如上柿我们可以用 $O(m\log\max{b})$ 的时间预处理出所有 $0\le x < p$ 的 $f(x)\bmod p$,$O(1)$ 地快速进行回答。

-

然后应该初学者都能想到通过 $y$ 次迭代求得 $f_y(x)\bmod p$,关键在于将迭代的复杂度降低。

-

考虑进行倍增,因为有 $f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))$。

-

令 $st_{x,k} = f_{2^k}(x)$ 则我们可以通过 $O(\log y)$ 的迭代求得答案。

-

$$
st_{x,k} =
\begin{cases}
f(x)\bmod p & k = 0 \
st_{st_{x,k - 1},k - 1} & \mathrm{Otherwise.}\
\end{cases}
$$

-

需要注意的是,因为 $y\le 10^7$,因此枚举 $k$ 直到 $2^k > 10^7$。

-

贴个代码

这里令 $f_{x,k} = st_{x,k}$。

+
+$$ +(x + y)\bmod p = (x\bmod p + y\bmod p) +$$ +
+ +
+$$ +(x \times y)\bmod p = ((x\bmod p)\times (y\bmod p))\bmod p +$$ +
+ +

所以对于一个多项式函数有等式 \(f(x) \bmod p = f(x\bmod p)\bmod p\) 存在。不明白的想想你的快速幂为什么对。

+
+$$ +f(x)\bmod p = \sum_{i = 1}^{m} a_i x^{b_i} \bmod p = \sum_{i = 1}^{m} (a_i (x\bmod p)^{b_i} \bmod p) \bmod p +$$ +
+ +

如上柿我们可以用 \(O(m\log\max{b})\) 的时间预处理出所有 \(0\le x < p\) 的 \(f(x)\bmod p\) \(O(1)\) 地快速进行回答。

+

然后应该初学者都能想到通过 \(y\) 次迭代求得 \(f_y(x)\bmod p\) 关键在于将迭代的复杂度降低。

+

考虑进行倍增,因为有 \(f_{2^k}(x) = f_{2^{k - 1}}(f_{2^{k - 1}}(x))\)

+

令 \(st_{x,k} = f_{2^k}(x)\) 则我们可以通过 \(O(\log y)\) 的迭代求得答案。

+
+$$ +st_{x,k} = +\begin{cases} + f(x)\bmod p & k = 0 \\ + st_{st_{x,k - 1},k - 1} & \mathrm{Otherwise.} \\ +\end{cases} +$$ +
+ +

需要注意的是,因为 \(y\le 10^7\) 因此枚举 \(k\) 直到 \(2^k > 10^7\)。

+

贴个代码

这里令 \(f_{x,k} = st_{x,k}\)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
constexpr int Y = 1e7 + 10;

rep (i, 0, p - 1)
rep (j, 1, m)
f[i][0] = (f[i][0] + 1ll * a[j] * fpow(i, b[j]) % p) % p;

for (int j = 1; (1 << j) <= Y; ++j)
rep (i, 0, p - 1)
f[i][j] = f[f[i][j - 1]][j - 1];

rep (i, 1, q)
{
cin >> x >> y; x %= p;
for (int k = 30; ~k; --k)
if ((1 << k) & y) x = f[x][k];
cout << x << endl;
}
-
P5377 [THUPC2019] 鸽鸽的分割 题解

P5377 [THUPC2019] 鸽鸽的分割 题解

简要题意

连结圆上 $n$ 个点,求最多能够把圆分成几个部分。

-

前置知识

欧拉公式:$F(ace)=E(dge) - V(ertex)+2$

-

人话:$\text{多边形面数} = \text{边数} - \text{顶点数} + 2$

+

P5377 [THUPC2019] 鸽鸽的分割 题解

简要题意

连结圆上 \(n\) 个点,求最多能够把圆分成几个部分。

+

前置知识

欧拉公式:\(F(ace)=E(dge) - V(ertex)+2\)

+

人话:\(\text{多边形面数} = \text{边数} - \text{顶点数} + 2\)

思路

将一个圆折叠成一个多面体,你可以进行一些奇妙的空间变换来达到这一点。

那么我们最后会多出一个底面。

-

因此在我们的这个圆中 $F(n)=E-V+1$

-

求 $V$

圆上已经有了 $n$ 个点。我们要使得圆内不存在三线共点的情况。

+

因此在我们的这个圆中 \(F(n)=E-V+1\)

+

求 \(V\)

圆上已经有了 \(n\) 个点。我们要使得圆内不存在三线共点的情况。

那么考虑每次选择四个顶点画出一个四边形的两条对角线。

-

于是又会生成 $C_{n}^{4}$ 个顶点。可以证明已经考虑完全了,于是有

-

$$
V = n + C_{n}^{4}
$$

-

求 $E$

原有 $C_{n}^{2}$ 条边,且圆环上的 $n$ 个点互相连接构成 $n$ 条边。

-

每多一个交点会增加两条多边形边。又有 $2\times C_{n}^{4}$ 条。

-

$$
E = n + C_{n}^{2} + 2\times C_{n}^{4}
$$

+

于是又会生成 \(C_{n}^{4}\) 个顶点。可以证明已经考虑完全了,于是有

+
+$$ +V = n + C_{n}^{4} +$$ +
+ +

求 \(E\)

原有 \(C_{n}^{2}\) 条边,且圆环上的 \(n\) 个点互相连接构成 \(n\) 条边。

+

每多一个交点会增加两条多边形边。又有 \(2\times C_{n}^{4}\) 条。

+
+$$ +E = n + C_{n}^{2} + 2\times C_{n}^{4} +$$ +
+

最后,我们展开这个逆天的柿子:

-

$$
\begin{aligned}
F(n) &= E - V + 1 \
&= n + C_{n}^{2} + 2\times C_{n}^{4} - n - C_{n}^{4} + 1 \
&= C_{n}^{2} + C_{n}^{4} + 1 \
&= \dfrac{n(n - 1)}{2} + \dfrac{n(n - 1)(n - 2)(n - 3)}{4\times 3 \times 2} + 1 \
&= \dfrac{x^4}{24} - \dfrac{x^3}{4} + \dfrac{23x^2}{24} - \dfrac{3x}{4} + 1
\end{aligned}
$$

+
+$$ +\begin{aligned} + F(n) &= E - V + 1 \\ + &= n + C_{n}^{2} + 2\times C_{n}^{4} - n - C_{n}^{4} + 1 \\ + &= C_{n}^{2} + C_{n}^{4} + 1 \\ + &= \dfrac{n(n - 1)}{2} + \dfrac{n(n - 1)(n - 2)(n - 3)}{4\times 3 \times 2} + 1 \\ + &= \dfrac{x^4}{24} - \dfrac{x^3}{4} + \dfrac{23x^2}{24} - \dfrac{3x}{4} + 1 +\end{aligned} +$$ +
+

去 OEIS 上校验结果,正确。

-

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电

© 2023 YttriumWillow  Powered by Hexo & Icarus

为💖发电