NOI2013向量内积

Link

非常巧妙的一道题目,记录一下。

暴力分给的很足, \(O(n^2d)\) 可以拿60pts。

做的时候思路比较混乱,最初的想法是尝试用矩阵来实现一个\(\prod^{t-1}_{i=1}vec_{i}\cdot vec_{t}\) 来判断是否有0。

最后迷迷糊糊地发现这个东西不可做,但是得到了这样的一个矩阵:

\[\begin{bmatrix} 1&0&0&0&0\\ 0&1&0&0&0\\ 0&0&1&0&0\\ 0&0&0&1&0\\ a_{1}&a_{2}&a_{3}&a_{4}&1\\ \end{bmatrix} \begin{bmatrix} b_{1}\\ b_{2}\\ b_{3}\\ b_{4}\\ 0 \\ \end{bmatrix} \]

可以发现这个东西非常鸡肋,只能求一个向量内积的前缀和,并没有什么用。

但是仔细想想,会发现当 \(k=2\) 的时候,假设当前枚举到了 \(i\) ,那么可以根据这个矩阵最后得到的向量的最后一维是否是 \(i-1\) 来判断是否存在内积为 \(0\) 的组合(因为每一对不为0的贡献是 \(i-1\)

可是并没有办法去得到\(\sum^{t-1}_{i=1}(vec_{i} \cdot vec_{t}) \mod 2\),得到的是 \( (\sum^{t-1}_{i=1}vec_{i} \cdot vec_{t}) \mod 2 \)

再然后思路就断掉了...

非常可惜,这里已经离正解不远了。

在看了一眼题解之后,发现

对于碰到的这个问题,可以通过random_shuffle之后多次判断来解决。

毛估估一下,即使是最坏情况下每次得到正确答案的概率也是 \(\frac{1}{2}\),大概做10次就行了。

可是这样子做复杂度是 \(O(nd^3)\) 的,还跑不过暴力,需要尝试发现特殊性质

然后是对于上面的这个矩阵得到前缀和的方法,在尝试使用分配律得到特殊类型的矩阵来优化复杂度的时候,发现它本质上其实就是在做 \(\sum^{n-1}_{i=1}\sum^{d}_{j=1}a_{t,j}a_{i,j}\)

所以折腾了半天其实都是在干无意义的事情

这里交换一下枚举顺序,然后前缀和优化,就不难得到一个 \(O(nd)\) 的做法。

\(k=3\) 的时候发现有 \(1^2 = 2^2 \mod 3\)

所以实际上跟上面差不多。

\[\begin{aligned} \sum^{t-1}_{i=1}(x_{i} \cdot x_{t})^2&=\sum^{t-1}_{i=1}\sum^{d}_{x=1}a_{t,x}a_{i,x}\sum^{d}_{y=1}a_{t,y}a_{i,y}\\ &=\sum^{t-1}_{i=1}\sum^{d}_{x=1}\sum^{d}_{y=1}a_{t,x}a_{i,x}a_{t,y}a_{i,y}\\ &=\sum^{d}_{x=1}\sum^{d}_{y=1}\sum^{t-1}_{i=1}a_{t,x}a_{i,x}a_{t,y}a_{i,y}\\ &=\sum^{d}_{x=1}\sum^{d}_{y=1}a_{t,x}a_{t,y}\sum^{t-1}_{i=1}a_{i,x}a_{i,y}\\ \end{aligned} \]

复杂度 \(O(nd^2)\) ,也可以轻松通过。

posted @ 2021-07-14 22:14  krimson  阅读(46)  评论(0编辑  收藏  举报