定義兩個$d$維向量$$,$$的內積為其相對應維度的權值的乘積和:
$$^a_i*b_i}$$
現在有$n$個$d$維向量,判斷是否存在兩個向量的內積為$k$的倍數$$
我們考慮將$n$個$d$維的向量構成乙個$n*d$的矩陣$a$,$a^$為$a$的轉置矩陣。
令矩陣$}$,那麼$}$就表示了向量$i$,與向量$j$的內積。
直接判斷內積的值即可。
但是這僅僅簡化了題意,複雜度仍是$d)}$,大概可以得到$50$分。
考慮$k=2$的情況(矩陣的取值均在模$2$的意義下進行討論)
我們有一種經典的方法判定兩個矩陣是否相等,我們只關心$0$元素是否存在。
令$c$為全$1$矩陣
在模$2$的意義下隨機乙個$1*n$的向量$x$。
根據矩陣乘法的結合律判斷等式$=x*c}$是否成立。
若是存在有乙個元素不相同,表示對應列上出現了乙個$0$向量,然後暴力尋找行的位置即可。
若是這一次沒有找到,也許是根本就沒有這樣的向量或者是剛好在這個$x$向量的影響下判為了相等,多做幾次,每次正確率約為$0.5$。
綜合暴力至此可以得到$75$分。
考慮$k=3$的情況,為什麼就不能像$k=2$的時候那樣做了呢?
因為矩陣$b$中的元素可以是$}$了,無法再和全$1$矩陣$c$比較。
想辦法將$k=3$的情況轉換為$k=2$的情況。
之所以不能像$k=2$做,是因為出現了結果為$2$的情況。
注意到乙個性質:$$
因此,如果我們將矩乘之後的矩陣d的所有結果平方,那麼c就能用全1矩陣了。
令$}$
$^\sum _^a(i,k_1)a(i,k_2)a(k1,j)a(k2,j)}$
你可以想象成可以把每乙個$d$維向量$a$轉化為了$}$維向量$z$,其中$=a_i*a_j (1\leq i,j\leq d)}$
$$這個時候變成了$}$的矩陣與$*n}$的矩陣相乘。
之後的做法就與$k=2$的情況相同。
綜合之前的分數可以獲得$100$分
notice:$k=3$的運算是在模$3$的意義下的,只是最後的結果平方之後的值只能為$}$。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9using
namespace
std;
10#define maxn 100100
11#define maxd 310
12#define llg long long
13#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
14llg n,a[maxn][maxd],d,k;
15llg x[maxn],nx[maxn];
16llg lx[maxn],y[maxn],ly[maxn],t,g[maxn],l[maxn],r[maxn];
17llg d;
18bool pd=false;19
20void
init()
2130}31
32void
check(llg i,llg j)
3343}44
45 inline void
solve2()
4665}66
}6768void
solve3()
6988 llg he=1;89
}90}91
}9293int
main()
94106
}107
else
108117
while (t--)
118122
}123
if (!pd) cout<<"
-1 -1";
124return0;
125 }
hack(若取全1矩陣c,但c的對角線均設為了0):
4621100
0011
1100
1110
0110
0111
$}$
0001001
0010
0100
0
全$$向量$$11
11$}$11
11 $$
1111
將誤判為相等。
NOI2013 向量內積
題面 題解窩本來想用這道題寫矩陣雜湊的,所謂矩陣雜湊,就是快速判斷兩個矩陣的乘積是不是另外乙個矩陣。矩陣雜湊就是隨機乙個向量,利用矩陣結合律先算向量和各矩陣的乘積,然後直接比較兩個向量是不是相等的。這樣本來是 n 3 的,就變成 n 2 的。但是看到題解第一種方法更簡便而且更易懂,就寫第一種方法了。...
矩陣乘法 NOI2013 向量內積
兩個 d 維向量 a a1,a2,ad 與 b b1,b 2,bd 的內積為其相對應維度的權值的乘積和,即 a b i 1 daib i a1 b1 a 2b2 ad bd現在有 n 個 d維向量 x1 x2,xn 小喵喵想知道是否存在兩個向量的內積為 k 的倍數。請幫助她解決這個問題。第一行包含 ...
NOI2013 向量內積(隨機好題)
先考慮 k 2 怎麼做。注意到點積不為0就為1。我們隨機乙個排列 p i 然後列舉 i 1 n 看看 p i 與 p 1.i 1 的點積和 s 如果 s i 1 mod k 則說明 p 1.i 1 中一定有乙個向量和 p i 的點積 0 此時暴力check就行了。最壞情況一次check的錯誤概率是 ...