In mathematics you don't understand things, you just get used to them.

标签 maths 下的文章

定义

中心场问题中一个守恒量。定义:$\mathbf{A}=\mathbf{p}\times\mathbf{L}-mk\hat{\mathbf r}$,其中 $\mathbf p$ 是动量, $\mathbf L$ 是角动量,$m$ 是物体质量,$k$ 是平方反比中心场的一个参量,比如对于万有引力问题,$k = GMm$,$\hat{\mathbf r}$ 是位矢的单位。下面证明其守恒性:

守恒性

我们想要证明 $\dot{\mathbf A} = \mathbf 0$,也就是 $\dot{\mathbf A} = \dot{\mathbf p}\times \mathbf L - mk\dot{\hat{\mathbf r}} = \mathbf 0$。

  • $\dot{\mathbf p}$:$\dot{\mathbf p} = \mathbf F = -\frac k{r^2}\hat{\mathbf r}$;
  • $\dot{\hat{\mathbf r}} = \dot{\hat\theta}\hat{\mathbf\theta}$;
  • $\mathbf L = \mathbf r \times m\mathbf v = m(r\hat{\mathrm r})\times(\dot r\hat{\mathbf r}+r\dot\theta\hat{\mathbf\theta})=mr^2\dot\theta\hat{\mathbf n}$.

因此

$$ \begin{align} \dot{\mathbf A} & = (-\frac k{r^2}\hat{\mathbf r})\times \mathbf F - mk\hat{\dot\theta}\hat\theta \\ & = -\frac k{r^2}\hat{\mathbf r}\times(mr^2\dot\theta\hat{\mathbf n})-mk\dot{\hat{\mathbf\theta}}\hat{\mathbf\theta} \\ & = -mk\dot\theta(\hat{\mathbf r}\times\hat{\mathbf n}+\hat{\mathbf\theta}) \\ & = \mathbf 0 \end{align} $$

Q.E.D.

应用

目前只见过用于证明开普勒第一定律,即天体运动的相对运动轨迹为圆锥曲线,或者数学地 $r=\frac p{1+\varepsilon\cos\theta}$。具体证明考虑 $\mathbf A \cdot\mathbf r$ 即可。


date: '2023-10-13'
title: 'Solution Set -「Nhk R2」'


A

观察数据范围, 我们可以发现 $n \leq 3000, k \leq 10^9$ 指向的是时间复杂度大概率是 $O(n^2)$ 的。 又由于是回文串, 和回文串相关的 $O(n^2)$ 算法最容易想到的就是枚举对称点暴力扩展。

接着再考虑如何处理操作, 如果我们单独有一个回文串, 想要扩展它的长度, 最优的方法就是在对称点进行操作, 这样每次操作后序列依旧回文, 如 $\texttt{bab}$ 可以操作为 $\texttt{baab}$ , $\texttt{bcbbcb}$ 可以操作为 $\texttt{bcbbbcb}$ 。

但是如果不是整个序列为回文串的话, 我们直接找最长回文子串然后在对称点进行操作不一定最优, 所以需要考虑在两侧进行操作(因为不在回文串两侧一定不是最优), 这时候有两种情况, 一种是可以通过在一侧进行操作后就能继续匹配, 如 $\texttt{bbabc}$ 可以对右侧的 $\texttt{b}$ 操作后扩展回文串长度, 回文串由 $\texttt{bab}$ 变为 $\texttt{bbabb}$ 这个时候我们执行这个操作, 因为这次操作和在对称点进行操作比一定不劣, 如果两端加数都不能继续匹配, 如 $\texttt{cbabd}$ , 就停止两侧的扩展, 因为此时想要在两侧操作后能扩展, 当且仅当同时对两边进行相同次数的操作, 这样和在对称点操作比起来一定不优。

最后, 如果我们有一段到了序列的首或尾, 我们直接选择在中间操作, 一直操作到长度等于 $k$ 。

B

从题目最强的限制入手,考虑如何使得每个点恰好处于一个环上?

这是一个很典的 trick,对于任何在环上的点 $p$,出入度都为 $1$,于是将它拆成两个点,记为 $p_{in}, p_{out}$。原图上的一条边 $(u, v)$ 在拆点后的图上就表示为 $(u_{out}, v_{in})$,如果要满足限制,当且仅当该图存在完美匹配。

现在加入双边权的限制,这是 0/1 分数规划 的模型,具体地,我们二分答案 $mid$,如果有解,则满足 $\large\frac{\sum_{i \in E} a_i }{\sum_{i \in E} b_i } \ge mid$,化一下式子变成 $\sum_{i \in E} a_i - mid \cdot {\sum_{i \in E} b_i } \ge 0$,于是重新对每一条边赋权为 $c_i = a_i - mid \cdot b_i$,检验是否有解直接跑 KM 即可。

复杂度取决于 KM 的实现方式,较优秀的为 $\Theta(n^3) \log V$,其中 $V$ 是 $a_i, b_i$ 的值域。

C

让我们来挖掘一些性质。不妨设 $n=2$,它的 $0\sim 2^n-1$ 的序列用二进制表示即为:

$$ \begin{matrix} 00 \\ 01 \\ 10 \\ 11 \\ \end{matrix} $$

那么当 $n=3$ 时,就相当于是在这个序列前加了一位,这一位可能是 $1$ 也可能是 $0$,列出来即为:

$$ \begin{matrix} 0\quad 00 \\ 0\quad 01 \\ 0\quad 10 \\ 0\quad 11 \\ 1\quad 00 \\ 1\quad 01 \\ 1\quad 10 \\ 1\quad 11 \\ \end{matrix} $$

所以可以发现:

  1. 异或值是对称的;
  2. 其最中间的数值是 $2^n-1$。

我们再对比上面 $n=2$ 与 $n=3$ 的区别,可以发现,题目的问题可以递推求解。

我们设第一个问题是的答案是 $f$,第二个问题是 $g$。那么有以下式子:

$$ \begin{cases} f_i=2\times f_{i-1}+\binom{n}{i} \\ \\ g_i=2\times g_{i-1}+i\binom{n}{i} \end{cases} $$

我们把上面第一个式子化为求和式,即为 $\displaystyle\sum_{i=1}^n2^{n-i}\binom{n}{i}$,又因为 $\displaystyle\binom{n}{i}=\binom{n}{n-i}$,所以 $\displaystyle=\sum_{i=1}^n2^{n-i}\binom{n}{n-i}\displaystyle=-2^n\times\binom{n}{n}+\sum_{i=0}^n2^{n-i}\binom{n}{n-i}$,换一下元,即 $\displaystyle-2^n\times\binom{n}{n}+\sum_{i=0}^n2^{i}\binom{n}{i}$,又通过二项式定理,得到原式即 $(2+1)^n-2^n=3^n-2^n$,用快速幂求解即可。

我们把上面第二个式子化为求和式,即为 $\displaystyle\sum_{i=1}^ni\times2^{n-i}(2^i-1)\binom{n}{i}$ 因为加上 $i=0$ 其值不变故可写为 $\displaystyle\sum_{i=0}^ni\times2^{n-i}(2^i-1)\binom{n}{i}$,将括号拆开 $\displaystyle\sum_{i=0}^ni2^{n}\binom{n}{i}-\sum_{i=0}^ni2^{n-i}\binom{n}{i}$ 我们将其看作左右两个式子求解,先看左边,即为 $\displaystyle\sum_{i=0}^ni2^{n}\binom{n}{i}$,将 $2^n$ 提出,即 $\displaystyle2^{n}\sum_{i=0}^ni\binom{n}{i}=2^{n-1}(\sum_{i=0}^ni\binom{n}{i}+\sum_{i=0}^ni\binom{n}{i})$ 再将式子括号右边的求和式通过 $\binom{n}{i}=\binom{n}{n-i}$ 变换一下,即 $\displaystyle 2^{n-1}(\sum_{i=0}^ni\binom{n}{i}+\sum_{i=0}^ni\binom{n}{n-i})$ 再换元,即 $\displaystyle2^{n-1}(\sum_{i=0}^ni\binom{n}{i}+\sum_{i=0}^n(n-i)\binom{n}{i})$ 再将括号中的数加起来,即 $=2^{n-1}\sum_{i=0}^nn\binom{n}{i}$,再将 $n$ 提出,即 $\displaystyle n2^{n-1}\sum_{i=0}^n\binom{n}{i}$ 再用二项式定理,可化为:$n2^{n-1}2^n=n2^{2n-1}$。

我们再考虑右边的式子 $\displaystyle-\sum_{i=0}^ni2^{n-i}\binom{n}{i}$,给其加上一个 $\displaystyle n\sum_{i=0}^{n}2^{n-i}\binom{n}{i}$,再减去,即 $\displaystyle\sum_{i=0}^{n}(n-i)2^{n-i}\binom{n}{i}-n\sum_{i=0}^{n}2^{n-i}\binom{n}{i}$ 右边式子的结果在上面求解第一个问题已经算过,为 $n*3^n$,化简即为 $\displaystyle\sum_{i=0}^{n}(n-i)2^{n-i}\binom{n}{i}-n*3^n$ 再换元,即为 $\displaystyle\sum_{i=0}^{n}i2^i\binom{n}{i}-n*3^n$ 再通过组合恒等式$\displaystyle\binom{n}{m}=n/m*\binom{n-1}{m-1}$,可化为 $\displaystyle\sum_{i=0}^{n}n2^i\binom{n-1}{i-1}-n*3^n$,提出 $2*n$,即为 $\displaystyle 2n\sum_{i=0}^{n}2^{i-1}\binom{n-1}{i-1}-n*3^n$ 再换元,即为 $\displaystyle 2n\sum_{i=0}^{n-1}2^{i}\binom{n-1}{i}-n*3^n$ 再用二项式定理,可化为 $\displaystyle 2n*3^{n-1}-n*3^n=-n*3^{n-1}$。

综上所述,第二问答案为 $n2^{2n-1}-n*3^{n-1}$,可用快速幂求解。

D

一个结论是任意无向图度数为奇数的点有偶数个。因为一条边会使得度数总和增加 $2$,度数总和永远是偶数。

所以如果建一个虚点向所有度数为奇数的点连边,则这个新图存在欧拉回路。

考虑初始图为二分图。然后加上虚点。

考虑从虚点出发,每走一条边,就染成跟上一条边不相同的颜色,即黑白间隔染色。则不被虚点连向的点(度数为偶数),每次进入这个点就会出这个点,边能一一对应。设初始图中 $a_x$ 表示 $x$ 点为端点的边有 $a_x$ 条被染成白色,$b_x$ 表示以 $x$ 为端点的边有 $b_x$ 条被染成黑色,则对于度数为偶数的点 $|a_x-b_x|=0$。对于度数为奇数的点,加上虚点连向的边,一样可以做到一进一出一一对应。由于虚点连向的边不产生贡献,所以 $|a_x-b_x|=1$。

则二分图 $\sum_x |a_x-b_x|$ 的答案为图中度数为奇数的点的个数。

考虑本题。驿站发件处看做左部点,收件处看做右部点,是一个二分图。所以可以用上述结论。

对于一个询问新加入的点,会对其右上的点的度数产生影响,而新加入点的度数为左下的点数。

首先二维数点求出初始答案,记为 $ans1$。然后记录每个点的度数奇偶性。

对于新加入的点分为三个二维数点。

第一个算新加入点的度数,记为 $deg1$。

第二个算新加入点右上角的点数,记为 $cnt1$。

第三个算新加入点右上角度数为偶数的点数,记为 $cnt2$

新答案为 $ans1+[deg1\%2=1]+cnt2-(cnt1-cnt2)$。

E

前三种操作维护起来比较简单,这里就略过了,第四种操作只需要注意到「最多操作 $\log_2 n$ 次」的性质即可。

主要来看询问部分。

整个图的形状就是一根「主链」上挂了若干根「副链」,由此可以发现这个图中的最长简单链的长相一定类似如下的图示:

$$ \cdots{\color{black}\bullet\ \bullet\ \bullet\ }\color{black}\bullet\ {\color{black}\bullet\ }{\color{red}{\bullet\ \bullet\ \bullet\ \bullet\ \bullet\ }}{\color{black}\bullet\ }\color{black}\bullet\ {\color{black}\bullet\ \bullet\ \bullet}\cdots\ \\ \cdots{\color{black}\bullet\ \color{red}{\bullet\ }\color{black}\bullet\ \bullet\ \bullet\ \color{red}{\bullet\ }}\color{black}\bullet\cdots \\ \cdots{\color{black}\bullet\ \color{red}{\bullet\ }\color{black}\bullet\ \bullet\ \bullet\ \color{red}{\bullet\ }}\color{black}\bullet\cdots \\ \cdots{\color{black}\bullet\ \color{red}{\bullet\ }\color{black}\bullet\ \bullet\ \bullet\ \color{red}{\bullet\ }}\color{black}\bullet\cdots \\ \vdots $$

其中红色的点是图中的最长链。那么我们考虑暴力怎么做。我们处理出两个东西,一个是上面那个图的第一层的权值前缀和 $a_i$,以及不包含第一层元素的每一条单链的权值和 $b_i$,那么答案即 $\max\limits_{1\leqslant i\leqslant j\leqslant n}\{a_j-a_{i-1}+b_i+b_j\}$。此时就可以考虑平衡树套线段树了,平衡树维护第一层的结点,线段树维护每条链除第一层结点外的部分,维护方法参见最大子段和。

F

记所有有颜色的边的属性集合 $S$ 。

首先在外层容斥,枚举 $S\in [0,2^w)$,计算被覆盖的的边中不包含 $S$ 中属性,并且没有被覆盖的边的数目恰好为 $i$ 的配对方案数。

暴力的 DP 做法是记录子树内还没有被匹配的点的数目,复杂度$O(n^5)$,不能通过。出题人特意卡了这种做法。

如果一条边没有覆盖,那么所有点对间的路径都不能经过这条边,这样我们可以把一个连通块分成两个子联通块进行求解。但是这样就要记录连通块里面所有的点,无法通过

考虑二项式反演。记 $g(i)$ 表示钦定断了 $i$ 条边(即$i$条边没有被覆盖)的方案数,$f(i)$ 表示恰好断了 $i$ 条边的方案数,注意这里的下标 $i$ 不包含一定不被覆盖的边。那么有:

$g(i)=\sum _{j=i}^{n-1}\binom{j}{i}f(j)\Rightarrow f(i)=\sum_{j=i}^{n-1}(-1)^{j-i}\binom{j}{i}g_j$

而 $g(i)$ 是好算的,也就是剩下的每个连通块内部任意连边的方案数的乘积

记 $h(n)$ 表示大小为 $n$ 的连通块任意连边的方案数,如果 $n$ 为奇数那么答案是 $0$,如果 $n$ 为偶数那么答案是 $(n-1)\times (n-3)\times ...\times 1$

考虑 DP。设 $dp(u, i, j)$ 表示以 $u$ 为根的子树,已经断了 $i$ 条边,连通块大小为 $j$ 的方案数。对于一条边 $(u,v,w)$ 转移式子如下:

$1.1$ $dp(u, i, j) \times dp(v, i_2, j_2) \times h(j_2) \to dp(u, i + i_2+1, j)$

$1.2$ 如果 $w\notin S$,$dp(u,i,j)\times dp(v,i_2,j_2)\to dp(u,i+i_2,j+j_2)$

这个 DP 的时间复杂度上界是 $O(n^4)$ 的,因此总复杂度 $O(2^wn^4)$ 。

但是注意到每个连通块大小都是必须偶数,因此常数极小,实测单次 DP 计算量在 $10^6$ 左右,链的情况可以卡满。注意要把 DP 值为 0 的状态跳过,否则无法通过

数据里面造了一些几条链并起来的情况,暴力要跑 4s 以上,std 能稳定在 0.5s 内出解。随机数据下基本卡不了。如果有人暴力冲过去了或者正解被卡常了,出题人在这里谢罪:(

考虑到打这场比赛的大佬肯定还是比较多的,如果场切这道题的大佬们有更精确的分析复杂度的方式欢迎赛后分享。


date: '2023-10-04'
title: 'Solution -「ARC 106E」Medals'


Desc.

Link.

你有 $n$ 个朋友,他们会来你家玩,第 $i$ 个人 $1...A_i$ 天来玩,然后 $A_i+1...2A_i$ 天不来,然后 $2A_i+1...3A_i$
又会来,以此类推;

每天你会选一个来玩的人,给他颁个奖,如果没人来玩,你就不颁奖。

你要给每个人都颁 $K$ 个奖,问至少需要多少天。

Sol.

前面的部分很套路了,主要看看建出二分图后我们应该做什么。首先根据 Hall's marriage theorem,我们要做的是判断任意子集的邻域大小是否大于等于该子集的大小。把 $n$ 个人拆成 $n\times k$ 个点,可以发现进行判断时不需要把同一类点(由同一个工人拆出来的 $k$ 个点)分开。设 $f(S)$ 为满足存在集合 $S$ 中任一工人会来打工的天数,则有解的一个充要条件为 $\forall S\subseteq 2^{\{1,\dots,n\}},m-f(U\setminus S) \geqslant |S|\times k$。

const int N = 18, K = 1e5;
int n, k, a[N + 5], f[2 * N * K + 5], g[1 << N];
bool check(int upp) {
    const int LIM = 1 << n, U = LIM - 1;
    for (int i=0;i<LIM;++i) g[i] = 0;
    rep (i,1,upp) g[f[i]]++;
    for (int j=0;j<n;++j) for (int i=0;i<LIM;++i) if (!(i&(1<<j))) g[i|(1<<j)] += g[i];
    for (int i=0;i<LIM;++i) if (upp - g[U^i] < __builtin_popcount(i) * k) return false;
    return true;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    rd(n, k); rds0i(a, n);
    for (int i=0;i<n;++i) {
        for (int t=0;;t+=2) for (int j=t*a[i]+1;j<(t+1)*a[i]+1;++j) {
            if (j > 2 * n * k) goto label;
            f[j] |= 1<<i;
        }
        label:;
    }
    int l = 0, r = 2 * n * k, res = -1;
    while (l <= r) {
        if (int mid = (l + r) / 2; check(mid)) r = mid - 1, res = mid;
        else l = mid + 1;
    }
    cout << res << "\n";
}

poj 2888

n 种轮换($|G|=n$)

第 i 种可以分成长度为 $\frac{n}{\gcd(n,i)}$ 的 $\gcd(n,i)$ 个轮换

$\forall g\in G$,$|X^g|$(不定点个数)等于规模为 $\gcd(n,i)$ 的环的答案然后搞一搞

傻逼poj

P4916

枚举 $d$

转化成有 $d$ 个球,要染 $\frac md$ 个,不能有连续 $k$ 个被染色

考虑插板,有 $\frac{m}{d}$ 个色球,$d-\frac{m}{d}$ 个无色球,把色球插入无色球之间

断换成链的手段是枚举首尾之间插入的色球数量

$\displaystyle \sum_{i=0}^k(i+1)\times f(\frac{m}{d}-i,\frac nd-\frac{m}{d}-1,k)$

$f(n,m,k)$ 表示把 $n$ 个球分成 $m$ 组,每组不超过 $k$ 个的方案数(容斥)

p4128

把点置换转化成边置换,再用 Polya(大体思路)

设点置换群 $\lang G,\cdot \rang$,取某个 $g \in G$,$g=\prod_i (a_{i,1},a_{i,2},...,a_{i,n_i})$

  • $\forall i\neq j$,研究 $(a_i)$ 和 $(a_j)$

    比如 $(u,v)$,会被置换成 $(u+1,v+1)$,$(u+2,v+2)$,直到 $(u+\mathrm{lcm}(n,m),v+\mathrm{lcm}(n,m))$。置换的长度就是两个环的长度的 $\mathrm{lcm}$,一共有 $n\times m$ 个元素,所以一共 $\frac{nm}{\mathrm{lcm}(n,m)}=\gcd(n,m)$ 个循环

  • 研究 $(a_i)$(同一个循环节里面)

    $\frac n2$ 个循环

设 $g$ 拆成 $k$ 个循环

边循环个数 $\sum_{i}^k \frac{n_i}2+\sum_{i=1}^{k-1}\sum_{j=i+1}^k \gcd(n_i,n_j)$

不能枚举 $n!$ 种点排列

发现如果 $\{n_k\}$ 相同,贡献相同

$\{n_k\}$ 加起来是 $n$,枚举 $n$ 的分拆数(妙)

算 $\{n_k\}$ 的贡献系数:钦定 $n_1 \leqslant n_2 \leqslant \dots \leqslant n_k$,把每个循环看作圆排列,设 $t_i$ 为长度为 $i$ 的循环数,则系数为 $\frac{n!}{\prod n_i \prod t_i!}$

dfs+Polya 计算


Hi,各位……

两个多月没动过笔了,这期间我跟退役了一样

但是谁知道呢,答案在风中飘荡


多项式运算的一般形式可以写成解 $f(\mathbf u,\textbf v)\equiv0 \pmod {x^n}$ 的方程(在取模意义下研究主要是很多多项式算子会导出无穷项的结果……),其中 $\mathbf u$、$\mathbf v$ 代表两个多项式。先研究 $n=1$ 时的情况,即解方程 $f(\mathbf u,\mathbf v)\equiv0\pmod x$,这意味着取出常数项并解一个实方程。由这个结果拓展到一般,令 $\mathbf u_n$ 表示 $f(\mathbf u,\mathbf v)\equiv 0\pmod {x^{2^{n}}}$ 的解,则接下来的问题成了求解 $\mathbf u_n$ 到 $\mathbf u_{n+1}$ 的关系式。

把 $f(\mathbf u_{n+1},\mathbf v)$ 在 $(\mathbf u_n,\mathbf v)$ 处施加泰勒展开,有 $\displaystyle f(\mathbf u_{n+1},v)=\sum_{i=0}\frac{1}{i!}f_{\mathbf u_{i}}(\mathbf u_n,\mathbf v)(\mathbf u_{n+1}-\mathbf u_n)^i$。由于 $x^{2^n} \mid \mathbf u_{n+1}-\mathbf u_n$,所以 $f(\mathbf u_{n+1},\mathbf v)=f(\mathbf u_n,v)+f_{\mathbf u}(\mathbf u_n,\mathbf v)(\mathbf u_{n+1}-\mathbf u_n)\equiv 0 \pmod {x^{2^{n+1}}}$,则 $\mathbf u_{n+1}=\mathbf u_n-\frac{f(\mathbf u_n,\mathbf v)}{f_{\mathbf u}(\mathbf u,\mathbf v)}$。

实际解题的步骤就是聪明地定义好 $f$ 后套上结论得到可以运算的递推式啦。