这道题目中D应该是<=100。。
我们可以把两个向量的点积看成1*d和d*1的矩阵相乘;那么我们将原始矩阵A转置得到A',A*A'[i,j]就是向量i*向量j的点积。
但是这样是O(N^2D)的;考虑用一些黑科技。考虑mod=2时,假设对于i,我们求出i之前的所有向量与i的点积的和;如果所有的点积都>0即=1,那么显然点积的和对二取模=(i-1)%2;否则如果≠(i-1)%2,显然i与i前面的某一个向量的点积=0,我们O(ND)寻找答案即可。但是这样不一定能得到解,我们不妨随机打乱向量的顺序然后判断,这样至少是1-(1/2)^5的正确率了。。
当mod=3时也是一样的,不过点积>0并不一定=1,但是注意到点积的平方>0则一定=1,把点积拆开来计算即可。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100005
#define M 101
#define rd ((rand_now=((long long)rand_now*20000909+2010527)