Loading...

2020.3.22解题报告

说实话,听完老师的讲解,我觉得这次的考试并没有这么难。但在考试的时候为什么就没想出来呢?(我太弱了)。

为了让老师有更好的体验,我还特意学了Markdown。

T1 神炎皇

听讲解,知道这题是数学题,要用线性筛求\(\phi()\)

考场上只想出了暴力……

好吧,讲一下正确的思路:

设数对\((a,b)\)\(d=gcd(a,b)\)

\(a'=\frac{a}{d}\)\(b'=\frac{b}{d}\)

我们要满足\((a+b)|ab\),也就是要满足 \((a'+b')d|(a'b')d^2\)

则我们可以得到\((a'+b')|(a'b')d\)

\(\because gcd(a',b')=1\)\((a'+b',a')=(a'+b',b')=1\)\(\therefore gcd(a'+b',a'b')=1\)

也就是\((a'+b')\)不是\(a'b'\)的因子,是\(d\)的因子,就是求\((a'+b')|d\)

再设\(m=(a'+b'),d=km\),则\(km^2\leqslant n\)

\(m\)只用枚举到\(\sqrt{n}\)

对于每一个\(m\)\(k\)\(\phi(i)\)

T2降雷皇

令以第n个数结尾的LIS长度为fi,易得\(f_i=max{f_j+1}\)
本来需要遍历每一个j,可是发现树状数组可以维护满足结合律的操作(如区间和,区间积,区间异或,区间最值等),复杂度可以降到\(O(logn)\),于是总复杂度为\(O(nlogn)\)

如何算LIS个数?设g[i]为长度为f[i]的LIS的方案数,有:

\(g_i=max(1,∑g_i)\)
可以用树状数组维护一下。

T3幻魔皇(参考题解的思路想出来的)

\(f_i\)是根节点为白色距离根节点为i的白点个数;
\(b_i\)是根节点为白色距离根节点为i的黑点个数;
\(a_i\)是根节点为黑色距离根节点为i的白点个数.

画图可知有\(a_i\)为斐波那契数列。

\(f_i\)=\(b_{i-1}\),\(b_i\)=\(b_{i-1}\)+\(f_{i-1}\)

对白LCA,枚举距离i

\(ans_i\)=\(f_i∑f_j\)

对黑LCA,还是枚举距离i,

找它的两个儿子来统计,

枚举其中一个儿子的长度为k。

ansi=∑k=1i fk−1×ai−k−2∑j=1n−1−max(k−1,i−k−1)bj(太难打出来了QWQ,Markdown太难用了)

posted @ 2020-11-01 00:12  CNF_Acceptance  阅读(58)  评论(0)    收藏  举报