2023学校周赛Round1 Div1

\(A\)
拿个栈模拟一下。

\(B\)
推一推式子,把\((\displaystyle\sum_{i=1}^{n}a_i)^3\)展开,会得到三种类型的式子,其中两个都是可以线性求出来的,第三个的6倍就是答案。

\(C\)
一个比较高妙的思维题,不太懂。

\(D\)
不懂,我觉得带\(log\)的肯定会超时,但是有一个高妙的数学方法不会超时。

\(E\)
矩阵乘法是\(O(n^3)\)的,肯定是过不了的(因为\(n\leq 3000\)),考虑变成求个逆矩阵也是不行的,因为逆矩阵的高斯消元也是\(O(n^3)\)的,所以正常做法肯定不行。
后来想到了矩阵分块,把一个块的大小定为\(\sqrt{n}\times\sqrt{n}\),然后我找\(\sqrt{n}\)个块来检测,每次检测的复杂度是\(O(n^{1.5})\),但是很难实现,因为\(n\)不一定是完全平方数,开根之后块的大小并不统一,细节很麻烦,遂放弃。
考虑随机化,比赛的时候想了一个感觉很对的做法,就是我只检查矩阵\(C\)的副对角线、随机一行、随机一列、随机\(n\)个数的值是否符合要求。但是被卡掉了,赛后经过了解,发现出数据的方法是直接把\(A\times B\)的矩阵中修改某几个数的值,所以我随机到这几个数的概率非常小,所以我这样做肯定过不了。
正解还是随机化,我们考虑上面的错误解法错在哪里,上面的做法是不会顾及到\(A,B,C\)的每一个元素的,所以检测结果有很大的偶然性,我们要想一个办法顾及到所有的元素。所以我们想到了用矩阵乘向量,这样出来的结果是体现了每一个元素的。所以我们随机常数个(不能太多,\(10\)左右即可)列向量\(x\),检测\(ABx=Cx\)是否成立,根据结合律,先算\(y=Bx\),再算\(Ay\),因为是矩阵乘向量,所以单次的复杂度是\(O(n^2)\),所以复杂度就对了,答案也对了。

posted @ 2023-03-12 22:57  从零开始sfcn  阅读(14)  评论(0编辑  收藏  举报