NOI2013 向量內積

2022-05-26 01:12:13 字數 2306 閱讀 5847

定義兩個$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 #include9

using

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):

462

1100

0011

1100

1110

0110

0111

$}$

000

1001

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的錯誤概率是 ...