NOI2013 向量內積

2022-05-23 21:42:12 字數 1166 閱讀 6815

題面

題解窩本來想用這道題寫矩陣雜湊的,所謂矩陣雜湊,就是快速判斷兩個矩陣的乘積是不是另外乙個矩陣。

矩陣雜湊就是隨機乙個向量,利用矩陣結合律先算向量和各矩陣的乘積,然後直接比較兩個向量是不是相等的。

這樣本來是$n^3$的,就變成$n^2$的。

但是看到題解第一種方法更簡便而且更易懂,就寫第一種方法了。

所謂內積,就是點乘。

首先是二維的情況,假設檢查到$i$個,我們檢查$i$和$1..i-1$的字首和的內積是否為$(i-1)\% 2$,如果不是,一定說明$i$和前面的某個$x$的內積是2的倍數,遍歷$1~i-1$檢查一遍。否則,不知道有沒有,就不檢查了。

三維的情況不能直接套用,因為如果內積不是$3$的倍數,不知道具體是餘$1$還是餘$2$,但是我們知道,不管是$1$還是$2$,他們的平方都是餘$1$的(記得當年在奧數班,南小大聚聚$xjt$講的結論),所以我們考慮求的形式$$(a_1b_1+a_2b_2+...+a_kb_k)^2=a_1b_1\times(a_1b_1+....+a_kb_k)+....+a_kb_k\times(a_1b_1+....+a_kb_k)$$,所以拆成$k^2$維的向量(或者說,拆成$k\times k$的「矩陣」)

然後很寒摻,只有$85$分,最後$3$個點$t$了,我也不知道怎麼回事啊。

#include#include

#include

#include

#define ri register int

#define n 100050

#define d 105

using

namespace

std;

intn,d,k;

intv[n][d];

intb[d],c[d][d];

intid[n];

inline

intread()

inline

int work(int

cur)

else

return ret%k;

}inline

bool check(int

cur)

} return0;

}int

main()

} puts(

"-1 -1");

return0;

}

NOI2013 向量內積

定義兩個 d 維向量 的內積為其相對應維度的權值的乘積和 a i b i 現在有 n 個 d 維向量,判斷是否存在兩個向量的內積為 k 的倍數 我們考慮將 n 個 d 維的向量構成乙個 n d 的矩陣 a a 為 a 的轉置矩陣。令矩陣 那麼 就表示了向量 i 與向量 j 的內積。直接判斷內積的值即...

矩陣乘法 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的錯誤概率是 ...